Skip to content

chore(copier): update from template - #105

Open
liblaf-copier[bot] wants to merge 109 commits into
mainfrom
copier-update/main
Open

chore(copier): update from template#105
liblaf-copier[bot] wants to merge 109 commits into
mainfrom
copier-update/main

Conversation

@liblaf-copier

@liblaf-copier liblaf-copier Bot commented Jun 6, 2026

Copy link
Copy Markdown

Automated changes by Shared / Copier Update Workflow

liblaf added 30 commits January 27, 2026 23:29
…ctivation

This commit introduces a set of scripts and data for inverse toy experiments, specifically focusing on forward simulations and muscle activation models. The additions include:
- Generation scripts for initial data and configurations.
- Multiple forward simulation implementations (`20-forward.py`, `20-forward-newton.py`, `20-forward-muscle.py`) to explore different solver methods and muscle models.
- Data files including VTU/VTP meshes and simulation results.
- A orchestration script `run-all.sh` to facilitate batch processing of experiments with varying parameters.

These changes provide the foundational infrastructure for investigating inverse problems in tissue simulation.

Why: These experiments are necessary to validate the forward model accuracy and establish a baseline for subsequent inverse optimization tasks.
Introduce a unified modeling architecture that supports both JAX and Warp energy terms within a single model. This change allows the framework to leverage JAX's flexible auto-differentiation and Warp's high-performance physics kernels where they are most effective, facilitating more complex simulation scenarios like prestrained mass-spring systems.

- implement JaxEnergy and JaxModel to support JAX-native energy terms
- add JaxMassSpring and JaxMassSpringPrestrain energy implementations
- introduce WarpPhaceV2 and WarpVolumePreservationDeterminant for the Warp backend
- refactor WarpElastic base class to support kernel overloading and improved material handling
- update ModelBuilder to compose models from both JAX and Warp energy components
- enhance WarpModelAdapter with value_and_grad support and improved JAX FFI integration
- update experiment scripts and diagnostic settings to facilitate better debugging and simulation runs
Implement mesh generation, subface mass-spring simulations, and whole-mesh solvers for SMAS modeling. These scripts facilitate testing hierarchical simulation workflows where surface deformations drive volumetric results.

Clean up Warp configuration and enable the optimization step in the inverse-toy forward script to transition from debugging to execution.
Add visualization figures for input data, Phace solutions, and SMAS solutions to document the results of the inverse modeling experiment.
Add SMAS_FRACTION constant and update ARAP energy kernels to support volume fraction scaling. This allows for modeling heterogeneous material compositions within a single mesh element, which is necessary for accurately simulating complex anatomical structures like the SMAS layer.

- Implement SMAS geometry generation and volume fraction computation
- Support scaling energy, gradient, and Hessian by volume fraction in Warp kernels
- Fix launch dimensions for Hessian diagonal computations
- Clean up Warp energy implementations and add experiments for SMAS simulation
- Add new inverse physics module with loss functions and adjoint solving
- Add scene module with PHACE v3 implementation
- Extract common material utilities from elastic energy functions
- Consolidate warp energy function files into base implementations
- Remove deprecated _phace_v2 implementation
- Add model type definitions and scene builders
- Update dependencies and configuration

BREAKING CHANGE: Refactored warp elastic energy module structure
- adjust muscle and SMAS layer dimensions in mesh generation
- increase stiffness constants (MU and LAMBDA) in Phace V3 model
- update simulation scripts to support suffixed experimental outputs
- add new VTU data files and visualization figures for SMAS experiments
- update warp-lang dependency in lockfile

Refine simulation geometry and material properties to improve accuracy and better organize experimental results across different configurations.
url: https://www.comet.com/liblaf/apple/af1d1c7273504bb2aab67bac7a11c5f1
exp_dir: exp/2026/01/28/smas
cwd: exp/2026/01/28/smas
cmd: python ./src/30-inverse.py
params:
  target: /home/liblaf/github/liblaf/apple/exp/2026/01/28/smas/data/20-forward-smas46-muscle46-prestrain.vtu
inputs:
- exp/2026/01/28/smas/data/20-forward-smas46-muscle46-prestrain.vtu
outputs:
- exp/2026/01/28/smas/data/30-inverse-smas46-muscle46-prestrain.vtu
temps:
- exp/2026/01/28/smas/temp/30-inverse-smas46-muscle46-prestrain.vtu.series
url: https://www.comet.com/liblaf/apple/19f667ae24654fddafa6f1792bfb37d6
exp_dir: exp/2026/01/28/smas
cwd: exp/2026/01/28/smas
cmd: python ./src/30-inverse.py
params:
  target: /home/liblaf/github/liblaf/apple/exp/2026/01/28/smas/data/20-forward-whole-smas02-muscle02-act2.vtu
inputs:
- exp/2026/01/28/smas/data/20-forward-whole-smas02-muscle02-act2.vtu
url: https://www.comet.com/liblaf/apple/52f0a256e597412c86ec37ec51f5f57a
exp_dir: exp/2026/01/28/smas
cwd: exp/2026/01/28/smas
cmd: python ./src/30-inverse.py
params:
  target: /home/liblaf/github/liblaf/apple/exp/2026/01/28/smas/data/20-forward-whole-smas02-muscle02-act2.vtu
inputs:
- exp/2026/01/28/smas/data/20-forward-whole-smas02-muscle02-act2.vtu
outputs:
- exp/2026/01/28/smas/data/30-inverse-whole-smas02-muscle02-act2.vtu
temps:
- exp/2026/01/28/smas/temp/30-inverse-whole-smas02-muscle02-act2.vtu.series
url: https://www.comet.com/liblaf/apple/12d6ffc86d774e6796f4cd8fab6b23d5
exp_dir: exp/2026/01/28/smas
cwd: exp/2026/01/28/smas
cmd: python ./src/30-inverse.py
params:
  target: /home/liblaf/github/liblaf/apple/exp/2026/01/28/smas/data/20-forward-whole-smas02-muscle02-act2.vtu
inputs:
- exp/2026/01/28/smas/data/20-forward-whole-smas02-muscle02-act2.vtu
outputs:
- exp/2026/01/28/smas/data/30-inverse-unreachable-whole-smas02-muscle02-act2.vtu
temps:
- exp/2026/01/28/smas/temp/30-inverse-unreachable-whole-smas02-muscle02-act2.vtu.series
url: https://www.comet.com/liblaf/apple/bf816a8eb8ca477b8e8f789de003d1b1
exp_dir: exp/2026/01/28/smas
cwd: exp/2026/01/28/smas
cmd: python ./src/30-inverse.py
params:
  target: /home/liblaf/github/liblaf/apple/exp/2026/01/28/smas/data/20-forward-whole-smas02-muscle02-act2.vtu
inputs:
- exp/2026/01/28/smas/data/20-forward-whole-smas02-muscle02-act2.vtu
temps:
- exp/2026/01/28/smas/temp/30-inverse-whole-smas02-muscle02-act2.vtu.series
url: https://www.comet.com/liblaf/apple/103468443470454b92e1a262d37506d1
exp_dir: exp/2026/01/28/smas
cwd: exp/2026/01/28/smas
cmd: python ./src/30-inverse.py
params:
  target: /home/liblaf/github/liblaf/apple/exp/2026/01/28/smas/data/20-forward-whole-smas02-muscle02-act2.vtu
inputs:
- exp/2026/01/28/smas/data/20-forward-whole-smas02-muscle02-act2.vtu
temps:
- exp/2026/01/28/smas/temp/30-inverse-whole-smas02-muscle02-act2.vtu.series
Refresh diff and solution PNGs to improve visual clarity and ensure the figures match the latest analysis output.
url: https://www.comet.com/liblaf/apple/8640797b5ccd412884214e5609981201
exp_dir: exp/2026/01/28/smas
cwd: exp/2026/01/28/smas
cmd: python ./src/30-inverse.py
params:
  target: /home/liblaf/github/liblaf/apple/exp/2026/01/28/smas/data/20-forward-smas46-muscle46-prestrain.vtu
  curr_step: 43
inputs:
- exp/2026/01/28/smas/data/20-forward-smas46-muscle46-prestrain.vtu
temps:
- exp/2026/01/28/smas/temp/30-inverse-smas46-muscle46-prestrain.vtu.series
url: https://www.comet.com/liblaf/apple/6dfc30bfd99647beabfd968fab237019
exp_dir: exp/2026/01/28/smas
cwd: exp/2026/01/28/smas
cmd: python ./src/30-inverse.py
params:
  target: /home/liblaf/github/liblaf/apple/exp/2026/01/28/smas/data/20-forward-smas46-muscle46-prestrain.vtu
  curr_step: 187
inputs:
- exp/2026/01/28/smas/data/20-forward-smas46-muscle46-prestrain.vtu
temps:
- exp/2026/01/28/smas/temp/30-inverse-smas46-muscle46-prestrain.vtu.series
url: https://www.comet.com/liblaf/apple/34f583710a954b7aa32bca352b5a6aea
exp_dir: exp/2026/01/28/smas
cwd: exp/2026/01/28/smas
cmd: python ./src/30-inverse-test.py
params:
  target: /home/liblaf/github/liblaf/apple/exp/2026/01/28/smas/data/20-forward-smas46-muscle46-prestrain-test.vtu
  curr_step: 172
inputs:
- exp/2026/01/28/smas/data/20-forward-smas46-muscle46-prestrain-test.vtu
temps:
- exp/2026/01/28/smas/temp/30-inverse-smas46-muscle46-prestrain-test.vtu.series
url: https://www.comet.com/liblaf/apple/034e956f6f2b4076824de78ad772cbf9
exp_dir: exp/2026/01/28/smas
cwd: exp/2026/01/28/smas
cmd: python ./src/30-inverse-test.py
params:
  target: /home/liblaf/github/liblaf/apple/exp/2026/01/28/smas/data/20-forward-smas46-muscle46-prestrain-test.vtu
  curr_step: 17
inputs:
- exp/2026/01/28/smas/data/20-forward-smas46-muscle46-prestrain-test.vtu
temps:
- exp/2026/01/28/smas/temp/30-inverse-smas46-muscle46-prestrain-test.vtu.series
url: https://www.comet.com/liblaf/apple/74c0fff49dbe4ddc8bbfe50b1cb0cdc3
exp_dir: exp/2026/01/28/smas
cwd: exp/2026/01/28/smas
cmd: python ./src/30-inverse-test.py
params:
  target: /home/liblaf/github/liblaf/apple/exp/2026/01/28/smas/data/20-forward-smas46-muscle46-prestrain-test.vtu
  curr_step: 73
inputs:
- exp/2026/01/28/smas/data/20-forward-smas46-muscle46-prestrain-test.vtu
temps:
- exp/2026/01/28/smas/temp/30-inverse-smas46-muscle46-prestrain-test.vtu.series
url: https://www.comet.com/liblaf/apple/43ac158f190b4914bb61426ace85f5b4
exp_dir: exp/2026/01/28/smas
cwd: exp/2026/01/28/smas
cmd: python ./src/30-inverse-test.py
params:
  target: /home/liblaf/github/liblaf/apple/exp/2026/01/28/smas/data/20-forward-smas46-muscle46-prestrain-test.vtu
  curr_step: 39
inputs:
- exp/2026/01/28/smas/data/20-forward-smas46-muscle46-prestrain-test.vtu
temps:
- exp/2026/01/28/smas/temp/30-inverse-smas46-muscle46-prestrain-test.vtu.series
url: https://www.comet.com/liblaf/apple/c1c204788e9a4a4c89a0dd6e9769598c
exp_dir: exp/2026/01/28/smas
cwd: exp/2026/01/28/smas
cmd: python ./src/30-inverse-test.py
params:
  target: /home/liblaf/github/liblaf/apple/exp/2026/01/28/smas/data/20-forward-smas46-muscle46-prestrain-test.vtu
  curr_step: 282
inputs:
- exp/2026/01/28/smas/data/20-forward-smas46-muscle46-prestrain-test.vtu
temps:
- exp/2026/01/28/smas/temp/30-inverse-smas46-muscle46-prestrain-test.vtu.series
url: https://www.comet.com/liblaf/apple/33fce96f96044911a4241a82679cc857
exp_dir: exp/2026/01/28/smas
cwd: exp/2026/01/28/smas
cmd: python ./src/30-inverse-test.py
params:
  target: /home/liblaf/github/liblaf/apple/exp/2026/01/28/smas/data/20-forward-smas46-muscle46-prestrain-test.vtu
  curr_step: 270
inputs:
- exp/2026/01/28/smas/data/20-forward-smas46-muscle46-prestrain-test.vtu
temps:
- exp/2026/01/28/smas/temp/30-inverse-smas46-muscle46-prestrain-test.vtu.series
url: https://www.comet.com/liblaf/apple/4e2f36d6fcfd47bb8062b5cd1f593164
exp_dir: exp/2026/03/11/test-inverse
cwd: exp/2026/03/11/test-inverse
cmd: python ./src/30-inverse.py
params:
  target: /home/liblaf/github/liblaf/apple/exp/2026/03/11/test-inverse/data/20-forward.vtu
inputs:
- exp/2026/03/11/test-inverse/data/20-forward.vtu
url: https://www.comet.com/liblaf/apple/3ff96e7d7dc9448284f04b90e29e321a
exp_dir: exp/2026/03/11/test-inverse
cwd: exp/2026/03/11/test-inverse
cmd: python ./src/30-inverse.py
params:
  target: /home/liblaf/github/liblaf/apple/exp/2026/03/11/test-inverse/data/20-forward.vtu
  curr_step: 199
inputs:
- exp/2026/03/11/test-inverse/data/20-forward.vtu
temps:
- exp/2026/03/11/test-inverse/temp/30-inverse.vtu.series
url: https://www.comet.com/liblaf/apple/a1c0ad14503b4daca70ced6634842c9b
exp_dir: exp/2026/03/11/test-inverse
cwd: exp/2026/03/11/test-inverse
cmd: python ./src/30-inverse.py
params:
  target: /home/liblaf/github/liblaf/apple/exp/2026/03/11/test-inverse/data/20-forward.vtu
  curr_step: 376
inputs:
- exp/2026/03/11/test-inverse/data/20-forward.vtu
temps:
- exp/2026/03/11/test-inverse/temp/30-inverse.vtu.series
url: https://www.comet.com/liblaf/apple/0628067a514c41d9971777371bc590bb
exp_dir: exp/2026/03/11/test-inverse
cwd: exp/2026/03/11/test-inverse
cmd: python ./src/30-inverse.py
params:
  target: /home/liblaf/github/liblaf/apple/exp/2026/03/11/test-inverse/data/20-forward.vtu
  curr_step: 447
inputs:
- exp/2026/03/11/test-inverse/data/20-forward.vtu
temps:
- exp/2026/03/11/test-inverse/temp/30-inverse.vtu.series
url: https://www.comet.com/liblaf/apple/244eb9c9c36941d7b83bfe76a3a739d9
exp_dir: exp/2026/03/11/test-inverse
cwd: exp/2026/03/11/test-inverse
cmd: python ./src/30-inverse.py
params:
  target: /home/liblaf/github/liblaf/apple/exp/2026/03/11/test-inverse/data/20-forward.vtu
  curr_step: 98
inputs:
- exp/2026/03/11/test-inverse/data/20-forward.vtu
temps:
- exp/2026/03/11/test-inverse/temp/30-inverse.vtu.series
url: https://www.comet.com/liblaf/apple/cf0aed1dc78248728f44d8aff53e4662
exp_dir: exp/2026/01/28/smas
cwd: exp/2026/01/28/smas
cmd: python ./src/30-inverse.py
params:
  target: /home/liblaf/github/liblaf/apple/exp/2026/01/28/smas/data/20-forward-smas46-muscle46-prestrain.vtu
inputs:
- exp/2026/01/28/smas/data/20-forward-smas46-muscle46-prestrain.vtu
temps:
- exp/2026/01/28/smas/temp/30-inverse-smas46-muscle46-prestrain.vtu.series
url: https://www.comet.com/liblaf/apple/cdfc558c7554462ea2a86bcbe5e78bc9
exp_dir: exp/2026/01/28/smas
cwd: exp/2026/01/28/smas
cmd: python ./src/30-inverse.py
params:
  target: /home/liblaf/github/liblaf/apple/exp/2026/01/28/smas/data/20-forward-smas46-muscle46-prestrain.vtu
  curr_step: 1001
inputs:
- exp/2026/01/28/smas/data/20-forward-smas46-muscle46-prestrain.vtu
outputs:
- exp/2026/01/28/smas/data/30-inverse-smas46-muscle46-prestrain.vtu
temps:
- exp/2026/01/28/smas/temp/30-inverse-smas46-muscle46-prestrain.vtu.series
url: https://www.comet.com/liblaf/apple/17fb0bc849744850a547a2ea6e7571f2
exp_dir: exp/2026/01/28/smas
cwd: exp/2026/01/28/smas
cmd: python ./src/30-inverse.py
params:
  target: /home/liblaf/github/liblaf/apple/exp/2026/01/28/smas/data/20-forward-smas46-muscle46-prestrain.vtu
  curr_step: 1001
inputs:
- exp/2026/01/28/smas/data/20-forward-smas46-muscle46-prestrain.vtu
outputs:
- exp/2026/01/28/smas/data/30-inverse-smas46-muscle46-prestrain.vtu
temps:
- exp/2026/01/28/smas/temp/30-inverse-smas46-muscle46-prestrain.vtu.series
liblaf and others added 20 commits May 31, 2026 20:02
url: https://www.comet.com/liblaf/apple/2fdc3c911a4d47e4b566fed0550097dc
exp_dir: exp/2026/05/20/inverse-face
cwd: .
cmd: /home/liblaf/github/liblaf/apple/.venv/bin/python3 exp/2026/05/20/inverse-face/src/20-inverse-face.py
  --inverse_max_steps 40 --inverse_min_steps 20 --series_stride 20
params:
  inverse_max_steps: 40
  inverse_min_steps: 20
  series_stride: 20
  E: 1.0
  activation_inv_diag_max: 8.0
  activation_inv_diag_min: -8.0
  activation_inv_shear_abs_max: 3.0
  active_fraction_tol: 0.001
  adam_beta1: 0.5
  adam_beta2: 0.9
  adam_eps: 1.0e-08
  adjoint_atol: null
  adjoint_atol_first_forward_residual_ratio: 0.5
  adjoint_maxiter: 5000
  adjoint_rtol: 0.0005
  forward_atol: 0.0
  forward_max_steps: 5000
  forward_rtol: 0.0005
  input: /home/liblaf/github/liblaf/apple/exp/2026/05/20/inverse-face/data/10-inverse-face-input.vtu
  inverse_lr: 0.03
  loss_tol: 1.0e-07
  lr_reduction_factor: 0.5
  lr_reduction_patience: 12
  max_lr_reductions: 6
  max_point_error_cm: 0.2
  min_inverse_lr: 0.0001
  nu: 0.49
  output: /home/liblaf/github/liblaf/apple/exp/2026/05/20/inverse-face/data/20-inverse-face.vtu
  output_input: /home/liblaf/github/liblaf/apple/exp/2026/05/20/inverse-face/data/20-inverse-face-input.vtu
  output_series: /home/liblaf/github/liblaf/apple/exp/2026/05/20/inverse-face/data/20-inverse-face.vtu.series
  output_summary: /home/liblaf/github/liblaf/apple/exp/2026/05/20/inverse-face/data/20-inverse-face-summary.json
  output_target: /home/liblaf/github/liblaf/apple/exp/2026/05/20/inverse-face/data/20-inverse-face-target.vtu
  report: /home/liblaf/github/liblaf/apple/exp/2026/05/20/inverse-face/docs/20-inverse-face.md
  require_adjoint_convergence: true
  require_forward_convergence: true
  smas_stiffness_ratio: 100.0
  stagnation_abs_tol: 1.0e-07
  stagnation_patience: 24
  stagnation_rel_tol: 0.0001
  target: /home/liblaf/github/liblaf/apple/exp/2026/05/20/inverse-face/data/10-inverse-face-target.vtu
  target_point_mask: IsFace
  curr_step: 0
outputs:
- exp/2026/05/20/inverse-face/data/10-inverse-face-input.vtu
- exp/2026/05/20/inverse-face/data/10-inverse-face-target.vtu
- exp/2026/05/20/inverse-face/data/20-inverse-face-input.vtu
- exp/2026/05/20/inverse-face/data/20-inverse-face-target.vtu
- exp/2026/05/20/inverse-face/data/20-inverse-face.vtu
- exp/2026/05/20/inverse-face/data/20-inverse-face.vtu.series
- exp/2026/05/20/inverse-face/data/20-inverse-face-summary.json
url: https://www.comet.com/liblaf/apple/0494054fc36b4c4da9ce32fbccb69338
exp_dir: exp/2026/05/20/inverse-face
cwd: .
cmd: /home/liblaf/github/liblaf/apple/.venv/bin/python3 exp/2026/05/20/inverse-face/src/20-inverse-face.py
  --inverse_max_steps 20 --inverse_min_steps 20 --series_stride 10
params:
  inverse_max_steps: 20
  inverse_min_steps: 20
  series_stride: 10
  E: 1.0
  activation_inv_diag_max: 8.0
  activation_inv_diag_min: -8.0
  activation_inv_shear_abs_max: 3.0
  active_fraction_tol: 0.001
  adam_beta1: 0.5
  adam_beta2: 0.9
  adam_eps: 1.0e-08
  adjoint_atol: null
  adjoint_atol_first_forward_residual_ratio: 0.5
  adjoint_maxiter: 5000
  adjoint_rtol: 0.0005
  forward_atol: 0.0
  forward_max_steps: 5000
  forward_rtol: 0.0005
  input: /home/liblaf/github/liblaf/apple/exp/2026/05/20/inverse-face/data/10-inverse-face-input.vtu
  inverse_lr: 0.02
  loss_tol: 1.0e-07
  lr_reduction_factor: 0.5
  lr_reduction_patience: 12
  max_lr_reductions: 6
  max_point_error_cm: 0.2
  min_inverse_lr: 0.0001
  nu: 0.49
  output: /home/liblaf/github/liblaf/apple/exp/2026/05/20/inverse-face/data/20-inverse-face.vtu
  output_input: /home/liblaf/github/liblaf/apple/exp/2026/05/20/inverse-face/data/20-inverse-face-input.vtu
  output_series: /home/liblaf/github/liblaf/apple/exp/2026/05/20/inverse-face/data/20-inverse-face.vtu.series
  output_summary: /home/liblaf/github/liblaf/apple/exp/2026/05/20/inverse-face/data/20-inverse-face-summary.json
  output_target: /home/liblaf/github/liblaf/apple/exp/2026/05/20/inverse-face/data/20-inverse-face-target.vtu
  report: /home/liblaf/github/liblaf/apple/exp/2026/05/20/inverse-face/docs/20-inverse-face.md
  require_adjoint_convergence: true
  require_forward_convergence: true
  smas_stiffness_ratio: 100.0
  stagnation_abs_tol: 1.0e-07
  stagnation_patience: 24
  stagnation_rel_tol: 0.0001
  target: /home/liblaf/github/liblaf/apple/exp/2026/05/20/inverse-face/data/10-inverse-face-target.vtu
  target_point_mask: IsFace
  curr_step: 6
outputs:
- exp/2026/05/20/inverse-face/data/10-inverse-face-input.vtu
- exp/2026/05/20/inverse-face/data/10-inverse-face-target.vtu
- exp/2026/05/20/inverse-face/data/20-inverse-face-input.vtu
- exp/2026/05/20/inverse-face/data/20-inverse-face-target.vtu
- exp/2026/05/20/inverse-face/data/20-inverse-face.vtu
- exp/2026/05/20/inverse-face/data/20-inverse-face.vtu.series
- exp/2026/05/20/inverse-face/data/20-inverse-face-summary.json
url: https://www.comet.com/liblaf/apple/9bc59088fa324a26ac47ce95e23932ac
exp_dir: exp/2026/05/20/inverse-face
cwd: .
cmd: /home/liblaf/github/liblaf/apple/.venv/bin/python3 exp/2026/05/20/inverse-face/src/20-inverse-face.py
  --inverse_max_steps 1 --inverse_min_steps 1 --series_stride 1000
params:
  inverse_max_steps: 1
  inverse_min_steps: 1
  series_stride: 1000
  E: 1.0
  activation_inv_diag_max: 8.0
  activation_inv_diag_min: -8.0
  activation_inv_shear_abs_max: 3.0
  active_fraction_tol: 0.001
  adam_beta1: 0.5
  adam_beta2: 0.9
  adam_eps: 1.0e-08
  adjoint_atol: 0.0
  adjoint_maxiter: 5000
  adjoint_rtol: 0.0005
  forward_atol: 0.0
  forward_max_steps: 5000
  forward_rtol: 0.0005
  input: /home/liblaf/github/liblaf/apple/exp/2026/05/20/inverse-face/data/10-inverse-face-input.vtu
  inverse_lr: 0.02
  loss_tol: 1.0e-07
  lr_reduction_factor: 0.5
  lr_reduction_patience: 12
  max_lr_reductions: 6
  max_point_error_cm: 0.2
  min_inverse_lr: 0.0001
  nu: 0.49
  output: /home/liblaf/github/liblaf/apple/exp/2026/05/20/inverse-face/data/20-inverse-face.vtu
  output_input: /home/liblaf/github/liblaf/apple/exp/2026/05/20/inverse-face/data/20-inverse-face-input.vtu
  output_series: /home/liblaf/github/liblaf/apple/exp/2026/05/20/inverse-face/data/20-inverse-face.vtu.series
  output_summary: /home/liblaf/github/liblaf/apple/exp/2026/05/20/inverse-face/data/20-inverse-face-summary.json
  output_target: /home/liblaf/github/liblaf/apple/exp/2026/05/20/inverse-face/data/20-inverse-face-target.vtu
  report: /home/liblaf/github/liblaf/apple/exp/2026/05/20/inverse-face/docs/20-inverse-face.md
  require_adjoint_convergence: true
  require_forward_convergence: true
  smas_stiffness_ratio: 100.0
  stagnation_abs_tol: 1.0e-07
  stagnation_patience: 24
  stagnation_rel_tol: 0.0001
  target: /home/liblaf/github/liblaf/apple/exp/2026/05/20/inverse-face/data/10-inverse-face-target.vtu
  target_point_mask: IsFace
  curr_step: 1
outputs:
- exp/2026/05/20/inverse-face/data/10-inverse-face-input.vtu
- exp/2026/05/20/inverse-face/data/10-inverse-face-target.vtu
- exp/2026/05/20/inverse-face/data/20-inverse-face-input.vtu
- exp/2026/05/20/inverse-face/data/20-inverse-face-target.vtu
- exp/2026/05/20/inverse-face/data/20-inverse-face.vtu
- exp/2026/05/20/inverse-face/data/20-inverse-face.vtu.series
- exp/2026/05/20/inverse-face/data/20-inverse-face-summary.json
url: https://www.comet.com/liblaf/apple/06f32dcbc54045948d374807b8cc62b5
exp_dir: exp/2026/05/20/inverse-face
cwd: .
cmd: /home/liblaf/github/liblaf/apple/.venv/bin/python3 exp/2026/05/20/inverse-face/src/20-inverse-face.py
  --inverse_max_steps 20 --inverse_min_steps 20 --series_stride 10
params:
  inverse_max_steps: 20
  inverse_min_steps: 20
  series_stride: 10
  E: 1.0
  activation_inv_diag_max: 8.0
  activation_inv_diag_min: -8.0
  activation_inv_shear_abs_max: 3.0
  active_fraction_tol: 0.001
  adam_beta1: 0.5
  adam_beta2: 0.9
  adam_eps: 1.0e-08
  adjoint_atol: 0.0
  adjoint_maxiter: 5000
  adjoint_rtol: 0.0005
  forward_atol: 0.0
  forward_max_steps: 5000
  forward_rtol: 0.0005
  input: /home/liblaf/github/liblaf/apple/exp/2026/05/20/inverse-face/data/10-inverse-face-input.vtu
  inverse_lr: 0.02
  loss_tol: 1.0e-07
  lr_reduction_factor: 0.5
  lr_reduction_patience: 12
  max_lr_reductions: 6
  max_point_error_cm: 0.2
  min_inverse_lr: 0.0001
  nu: 0.49
  output: /home/liblaf/github/liblaf/apple/exp/2026/05/20/inverse-face/data/20-inverse-face.vtu
  output_input: /home/liblaf/github/liblaf/apple/exp/2026/05/20/inverse-face/data/20-inverse-face-input.vtu
  output_series: /home/liblaf/github/liblaf/apple/exp/2026/05/20/inverse-face/data/20-inverse-face.vtu.series
  output_summary: /home/liblaf/github/liblaf/apple/exp/2026/05/20/inverse-face/data/20-inverse-face-summary.json
  output_target: /home/liblaf/github/liblaf/apple/exp/2026/05/20/inverse-face/data/20-inverse-face-target.vtu
  report: /home/liblaf/github/liblaf/apple/exp/2026/05/20/inverse-face/docs/20-inverse-face.md
  require_adjoint_convergence: true
  require_forward_convergence: true
  smas_stiffness_ratio: 100.0
  stagnation_abs_tol: 1.0e-07
  stagnation_patience: 24
  stagnation_rel_tol: 0.0001
  target: /home/liblaf/github/liblaf/apple/exp/2026/05/20/inverse-face/data/10-inverse-face-target.vtu
  target_point_mask: IsFace
  curr_step: 20
outputs:
- exp/2026/05/20/inverse-face/data/10-inverse-face-input.vtu
- exp/2026/05/20/inverse-face/data/10-inverse-face-target.vtu
- exp/2026/05/20/inverse-face/data/20-inverse-face-input.vtu
- exp/2026/05/20/inverse-face/data/20-inverse-face-target.vtu
- exp/2026/05/20/inverse-face/data/20-inverse-face.vtu
- exp/2026/05/20/inverse-face/data/20-inverse-face.vtu.series
- exp/2026/05/20/inverse-face/data/20-inverse-face-summary.json
name: prepare inverse face inputs
url: https://www.comet.com/liblaf/apple/0bc114f1f0d542fe8a0d411591473ecc
exp_dir: exp/2026/05/20/inverse-face
cwd: exp/2026/05/20/inverse-face
cmd: /home/liblaf/github/liblaf/apple/.venv/bin/python3 src/10-prepare-inverse-face.py
params:
  E: 1.0
  active_fraction_tol: 0.001
  expression: Expression000
  fixed_point_mask: IsCranium
  nu: 0.49
  output_input: /home/liblaf/github/liblaf/apple/exp/2026/05/20/inverse-face/data/10-inverse-face-input.vtu
  output_target: /home/liblaf/github/liblaf/apple/exp/2026/05/20/inverse-face/data/10-inverse-face-target.vtu
  smas_stiffness_ratio: 100.0
  source: /home/liblaf/github/liblaf/melon/exp/2025/04/30/human-head-anatomy/data/41-expression-3152k.vtu
  target_point_mask: IsFace
  target_scale: 1.0
outputs:
- exp/2026/05/20/inverse-face/data/10-inverse-face-input.vtu
- exp/2026/05/20/inverse-face/data/10-inverse-face-target.vtu
name: inverse face activation solve
url: https://www.comet.com/liblaf/apple/358ba59407d04c889952a2fc923bf6a4
exp_dir: exp/2026/05/20/inverse-face
cwd: exp/2026/05/20/inverse-face
cmd: /home/liblaf/github/liblaf/apple/.venv/bin/python3 src/20-inverse-face.py --initial-activation-inv
  data/20-inverse-face-checkpoint.npz --inverse-lr 0.08 --inverse-max-steps 240 --series-stride
  10
params:
  initial-activation-inv: data/20-inverse-face-checkpoint.npz
  inverse-lr: 0.08
  inverse-max-steps: 240
  series-stride: 10
  E: 1.0
  activation_inv_diag_max: 8.0
  activation_inv_diag_min: -8.0
  activation_inv_shear_abs_max: 3.0
  active_fraction_tol: 0.001
  adam_beta1: 0.5
  adam_beta2: 0.9
  adam_eps: 1.0e-08
  adjoint_atol: 0.0
  adjoint_maxiter: 10000
  adjoint_rtol: 0.0005
  checkpoint: /home/liblaf/github/liblaf/apple/exp/2026/05/20/inverse-face/data/20-inverse-face-checkpoint.npz
  failure_patience: 3
  forward_atol: 0.0
  forward_max_steps: 10000
  forward_rtol: 0.0005
  initial_activation_inv: data/20-inverse-face-checkpoint.npz
  input: /home/liblaf/github/liblaf/apple/exp/2026/05/20/inverse-face/data/10-inverse-face-input.vtu
  inverse_lr: 0.08
  inverse_max_steps: 240
  inverse_min_steps: 5
  loss_tol: 1.0e-07
  lr_reduction_factor: 0.5
  lr_reduction_patience: 1000000000
  max_lr_reductions: 0
  max_point_error_cm: 0.2
  min_inverse_lr: 0.0001
  nu: 0.49
  output: /home/liblaf/github/liblaf/apple/exp/2026/05/20/inverse-face/data/20-inverse-face.vtu
  output_input: /home/liblaf/github/liblaf/apple/exp/2026/05/20/inverse-face/data/20-inverse-face-input.vtu
  output_series: /home/liblaf/github/liblaf/apple/exp/2026/05/20/inverse-face/data/20-inverse-face.vtu.series
  output_summary: /home/liblaf/github/liblaf/apple/exp/2026/05/20/inverse-face/data/20-inverse-face-summary.json
  output_target: /home/liblaf/github/liblaf/apple/exp/2026/05/20/inverse-face/data/20-inverse-face-target.vtu
  report: /home/liblaf/github/liblaf/apple/exp/2026/05/20/inverse-face/docs/20-inverse-face.md
  require_adjoint_convergence: false
  require_forward_convergence: false
  series_stride: 10
  smas_stiffness_ratio: 100.0
  stagnation_abs_tol: 1.0e-07
  stagnation_patience: 40
  stagnation_rel_tol: 0.0001
  target: /home/liblaf/github/liblaf/apple/exp/2026/05/20/inverse-face/data/10-inverse-face-target.vtu
  target_point_mask: IsFace
exception: 'AttributeError: ''NoneType'' object has no attribute ''suffix''

  '
inputs:
- exp/2026/05/20/inverse-face/data/10-inverse-face-input.vtu
- exp/2026/05/20/inverse-face/data/10-inverse-face-target.vtu
outputs:
- exp/2026/05/20/inverse-face/data/20-inverse-face-input.vtu
- exp/2026/05/20/inverse-face/data/20-inverse-face-target.vtu
- exp/2026/05/20/inverse-face/data/20-inverse-face.vtu
- exp/2026/05/20/inverse-face/data/20-inverse-face.vtu.series
- exp/2026/05/20/inverse-face/data/20-inverse-face-summary.json
- exp/2026/05/20/inverse-face/data/20-inverse-face-checkpoint.npz
name: inverse face small lr every step
url: https://www.comet.com/liblaf/apple/0156228cae0f43838b5680a31dae767a
exp_dir: exp/2026/05/20/inverse-face
cwd: exp/2026/05/20/inverse-face
cmd: /home/liblaf/github/liblaf/apple/.venv/bin/python3 src/20-inverse-face.py --initial-activation-inv
  tmp/probe-lr01-checkpoint.npz --inverse-lr 0.03 --inverse-max-steps 2000 --inverse-min-steps
  20 --stagnation-patience 120
params:
  initial-activation-inv: tmp/probe-lr01-checkpoint.npz
  inverse-lr: 0.03
  inverse-max-steps: 2000
  inverse-min-steps: 20
  stagnation-patience: 120
  E: 1.0
  activation_inv_diag_max: 8.0
  activation_inv_diag_min: -8.0
  activation_inv_shear_abs_max: 3.0
  active_fraction_tol: 0.001
  adam_beta1: 0.5
  adam_beta2: 0.9
  adam_eps: 1.0e-08
  adjoint_atol: 0.0
  adjoint_maxiter: 10000
  adjoint_rtol: 0.0005
  checkpoint: /home/liblaf/github/liblaf/apple/exp/2026/05/20/inverse-face/data/20-inverse-face-checkpoint.npz
  failure_patience: 3
  forward_atol: 0.0
  forward_max_steps: 10000
  forward_rtol: 0.0005
  initial_activation_inv: tmp/probe-lr01-checkpoint.npz
  input: /home/liblaf/github/liblaf/apple/exp/2026/05/20/inverse-face/data/10-inverse-face-input.vtu
  inverse_lr: 0.03
  inverse_max_steps: 2000
  inverse_min_steps: 20
  loss_tol: 1.0e-07
  max_point_error_cm: 0.2
  nu: 0.49
  output: /home/liblaf/github/liblaf/apple/exp/2026/05/20/inverse-face/data/20-inverse-face.vtu
  output_input: /home/liblaf/github/liblaf/apple/exp/2026/05/20/inverse-face/data/20-inverse-face-input.vtu
  output_series: /home/liblaf/github/liblaf/apple/exp/2026/05/20/inverse-face/data/20-inverse-face.vtu.series
  output_summary: /home/liblaf/github/liblaf/apple/exp/2026/05/20/inverse-face/data/20-inverse-face-summary.json
  output_target: /home/liblaf/github/liblaf/apple/exp/2026/05/20/inverse-face/data/20-inverse-face-target.vtu
  smas_stiffness_ratio: 100.0
  stagnation_abs_tol: 1.0e-07
  stagnation_patience: 120
  stagnation_rel_tol: 0.0001
  target: /home/liblaf/github/liblaf/apple/exp/2026/05/20/inverse-face/data/10-inverse-face-target.vtu
  target_point_mask: IsFace
  curr_step: 0
exception: 'KeyboardInterrupt

  '
inputs:
- exp/2026/05/20/inverse-face/data/10-inverse-face-input.vtu
- exp/2026/05/20/inverse-face/data/10-inverse-face-target.vtu
outputs:
- exp/2026/05/20/inverse-face/data/20-inverse-face-input.vtu
- exp/2026/05/20/inverse-face/data/20-inverse-face-target.vtu
- exp/2026/05/20/inverse-face/data/20-inverse-face.vtu
- exp/2026/05/20/inverse-face/data/20-inverse-face.vtu.series
- exp/2026/05/20/inverse-face/data/20-inverse-face-summary.json
- exp/2026/05/20/inverse-face/data/20-inverse-face-checkpoint.npz
name: inverse face fresh conservative
url: https://www.comet.com/liblaf/apple/466c4fdf7bee4d5ea5b7329bb2e3b334
exp_dir: exp/2026/05/20/inverse-face
cwd: exp/2026/05/20/inverse-face
cmd: python ./src/20-inverse-face.py
params:
  E: 1.0
  activation_inv_diag_max: 8.0
  activation_inv_diag_min: -8.0
  activation_inv_shear_abs_max: 3.0
  active_fraction_tol: 0.001
  adam_beta1: 0.3
  adam_beta2: 0.9
  adam_eps: 1.0e-08
  adjoint_atol: 0.0
  adjoint_maxiter: 10000
  adjoint_rtol: 0.0005
  checkpoint: /home/liblaf/github/liblaf/apple/exp/2026/05/20/inverse-face/data/20-inverse-face-checkpoint.npz
  failure_patience: 3
  forward_atol: 0.0
  forward_max_steps: 10000
  forward_rtol: 0.0005
  initial_activation_inv: null
  input: /home/liblaf/github/liblaf/apple/exp/2026/05/20/inverse-face/data/10-inverse-face-input.vtu
  inverse_lr: 0.03
  inverse_max_steps: 1000
  inverse_min_steps: 80
  loss_tol: 1.0e-07
  max_point_error_cm: 0.2
  nu: 0.49
  output: /home/liblaf/github/liblaf/apple/exp/2026/05/20/inverse-face/data/20-inverse-face.vtu
  output_input: /home/liblaf/github/liblaf/apple/exp/2026/05/20/inverse-face/data/20-inverse-face-input.vtu
  output_series: /home/liblaf/github/liblaf/apple/exp/2026/05/20/inverse-face/data/20-inverse-face.vtu.series
  output_summary: /home/liblaf/github/liblaf/apple/exp/2026/05/20/inverse-face/data/20-inverse-face-summary.json
  output_target: /home/liblaf/github/liblaf/apple/exp/2026/05/20/inverse-face/data/20-inverse-face-target.vtu
  smas_stiffness_ratio: 100.0
  stagnation_abs_tol: 1.0e-08
  stagnation_patience: 250
  stagnation_rel_tol: 1.0e-05
  target: /home/liblaf/github/liblaf/apple/exp/2026/05/20/inverse-face/data/10-inverse-face-target.vtu
  target_point_mask: IsFace
  curr_step: 0
exception: 'KeyboardInterrupt

  '
inputs:
- exp/2026/05/20/inverse-face/data/10-inverse-face-input.vtu
- exp/2026/05/20/inverse-face/data/10-inverse-face-target.vtu
outputs:
- exp/2026/05/20/inverse-face/data/20-inverse-face-input.vtu
- exp/2026/05/20/inverse-face/data/20-inverse-face-target.vtu
- exp/2026/05/20/inverse-face/data/20-inverse-face.vtu
- exp/2026/05/20/inverse-face/data/20-inverse-face.vtu.series
- exp/2026/05/20/inverse-face/data/20-inverse-face-summary.json
- exp/2026/05/20/inverse-face/data/20-inverse-face-checkpoint.npz
name: prepare inverse face 515k
url: https://www.comet.com/liblaf/apple/ebe61930a825417ebb4a3353ce6f0987
exp_dir: exp/2026/05/20/inverse-face
cwd: exp/2026/05/20/inverse-face
cmd: /home/liblaf/github/liblaf/apple/.venv/bin/python3 src/10-prepare-inverse-face.py
params:
  E: 1.0
  active_fraction_tol: 0.001
  expression: Expression000
  fixed_point_mask: IsCranium
  nu: 0.49
  output_input: /home/liblaf/github/liblaf/apple/exp/2026/05/20/inverse-face/data/10-inverse-face-input.vtu
  output_target: /home/liblaf/github/liblaf/apple/exp/2026/05/20/inverse-face/data/10-inverse-face-target.vtu
  smas_stiffness_ratio: 100.0
  source: /home/liblaf/github/liblaf/melon/exp/2025/04/30/human-head-anatomy/data/41-expression-515k.vtu
  target_point_mask: IsFace
  target_scale: 1.0
outputs:
- exp/2026/05/20/inverse-face/data/10-inverse-face-input.vtu
- exp/2026/05/20/inverse-face/data/10-inverse-face-target.vtu
name: inverse face 515k fresh conservative
url: https://www.comet.com/liblaf/apple/2cc143305cc642baae4918113fa92075
exp_dir: exp/2026/05/20/inverse-face
cwd: exp/2026/05/20/inverse-face
cmd: /home/liblaf/github/liblaf/apple/.venv/bin/python3 src/20-inverse-face.py --inverse-lr
  0.01 --adam-beta1 0.3 --adam-beta2 0.9 --inverse-max-steps 1000 --inverse-min-steps
  80 --stagnation-patience 250 --stagnation-rel-tol 1e-5 --stagnation-abs-tol 1e-8
params:
  inverse-lr: 0.01
  adam-beta1: 0.3
  adam-beta2: 0.9
  inverse-max-steps: 1000
  inverse-min-steps: 80
  stagnation-patience: 250
  stagnation-rel-tol: 1.0e-05
  stagnation-abs-tol: 1.0e-08
  E: 1.0
  activation_inv_diag_max: 8.0
  activation_inv_diag_min: -8.0
  activation_inv_shear_abs_max: 3.0
  active_fraction_tol: 0.001
  adam_beta1: 0.3
  adam_beta2: 0.9
  adam_eps: 1.0e-08
  adjoint_atol: 0.0
  adjoint_maxiter: 10000
  adjoint_rtol: 0.0005
  checkpoint: /home/liblaf/github/liblaf/apple/exp/2026/05/20/inverse-face/data/20-inverse-face-checkpoint.npz
  failure_patience: 3
  forward_atol: 0.0
  forward_max_steps: 10000
  forward_rtol: 0.0005
  initial_activation_inv: null
  input: /home/liblaf/github/liblaf/apple/exp/2026/05/20/inverse-face/data/10-inverse-face-input.vtu
  inverse_lr: 0.01
  inverse_max_steps: 1000
  inverse_min_steps: 80
  loss_tol: 1.0e-07
  max_point_error_cm: 0.2
  nu: 0.49
  output: /home/liblaf/github/liblaf/apple/exp/2026/05/20/inverse-face/data/20-inverse-face.vtu
  output_input: /home/liblaf/github/liblaf/apple/exp/2026/05/20/inverse-face/data/20-inverse-face-input.vtu
  output_series: /home/liblaf/github/liblaf/apple/exp/2026/05/20/inverse-face/data/20-inverse-face.vtu.series
  output_summary: /home/liblaf/github/liblaf/apple/exp/2026/05/20/inverse-face/data/20-inverse-face-summary.json
  output_target: /home/liblaf/github/liblaf/apple/exp/2026/05/20/inverse-face/data/20-inverse-face-target.vtu
  smas_stiffness_ratio: 100.0
  stagnation_abs_tol: 1.0e-08
  stagnation_patience: 250
  stagnation_rel_tol: 1.0e-05
  target: /home/liblaf/github/liblaf/apple/exp/2026/05/20/inverse-face/data/10-inverse-face-target.vtu
  target_point_mask: IsFace
  curr_step: 137
exception: 'KeyboardInterrupt

  '
inputs:
- exp/2026/05/20/inverse-face/data/10-inverse-face-input.vtu
- exp/2026/05/20/inverse-face/data/10-inverse-face-target.vtu
outputs:
- exp/2026/05/20/inverse-face/data/20-inverse-face-input.vtu
- exp/2026/05/20/inverse-face/data/20-inverse-face-target.vtu
- exp/2026/05/20/inverse-face/data/20-inverse-face.vtu
- exp/2026/05/20/inverse-face/data/20-inverse-face.vtu.series
- exp/2026/05/20/inverse-face/data/20-inverse-face-summary.json
- exp/2026/05/20/inverse-face/data/20-inverse-face-checkpoint.npz
…3 beta1 0.5

name: inverse face 515k fresh smooth 0.1 l2 0.1 mse only lr 0.03 beta1 0.5
url: https://www.comet.com/liblaf/apple/392524890bc846eaa955f8ead18f46f0
exp_dir: exp/2026/05/20/inverse-face
cwd: exp/2026/05/20/inverse-face
cmd: /home/liblaf/github/liblaf/apple/.venv/bin/python3 src/20-inverse-face.py --activation-smooth-weight
  0.1 --activation-l2-weight 0.1 --inverse-lr 0.03 --adam-beta1 0.5 --adam-beta2 0.9
  --inverse-max-steps 3000 --inverse-min-steps 80 --stagnation-patience 300 --stagnation-rel-tol
  1e-5 --stagnation-abs-tol 1e-8 --output data/20-inverse-face-fresh-smooth-w01-l2-01-mseonly-lr003-beta105.vtu
  --output-series data/20-inverse-face-fresh-smooth-w01-l2-01-mseonly-lr003-beta105.vtu.series
  --output-summary data/20-inverse-face-fresh-smooth-w01-l2-01-mseonly-lr003-beta105-summary.json
  --output-snapshot data/20-inverse-face-fresh-smooth-w01-l2-01-mseonly-lr003-beta105.png
  --checkpoint data/20-inverse-face-fresh-smooth-w01-l2-01-mseonly-lr003-beta105-checkpoint.npz
params:
  activation-smooth-weight: 0.1
  activation-l2-weight: 0.1
  inverse-lr: 0.03
  adam-beta1: 0.5
  adam-beta2: 0.9
  inverse-max-steps: 3000
  inverse-min-steps: 80
  stagnation-patience: 300
  stagnation-rel-tol: 1.0e-05
  stagnation-abs-tol: 1.0e-08
  output: data/20-inverse-face-fresh-smooth-w01-l2-01-mseonly-lr003-beta105.vtu
  output-series: data/20-inverse-face-fresh-smooth-w01-l2-01-mseonly-lr003-beta105.vtu.series
  output-summary: data/20-inverse-face-fresh-smooth-w01-l2-01-mseonly-lr003-beta105-summary.json
  output-snapshot: data/20-inverse-face-fresh-smooth-w01-l2-01-mseonly-lr003-beta105.png
  checkpoint: data/20-inverse-face-fresh-smooth-w01-l2-01-mseonly-lr003-beta105-checkpoint.npz
  E: 1.0
  activation_inv_diag_max: 8.0
  activation_inv_diag_min: -8.0
  activation_inv_shear_abs_max: 3.0
  activation_l2_weight: 0.1
  activation_smooth_weight: 0.1
  active_fraction_tol: 0.001
  adam_beta1: 0.5
  adam_beta2: 0.9
  adam_eps: 1.0e-08
  adjoint_atol: 0.0
  adjoint_maxiter: 10000
  adjoint_rtol: 0.0005
  failure_patience: 3
  forward_atol: 0.0
  forward_max_steps: 10000
  forward_rtol: 0.0005
  initial_activation_inv: null
  input: /home/liblaf/github/liblaf/apple/exp/2026/05/20/inverse-face/data/10-inverse-face-input.vtu
  inverse_lr: 0.03
  inverse_max_steps: 3000
  inverse_min_steps: 80
  loss_tol: 1.0e-07
  max_point_error_cm: 0.2
  nu: 0.49
  output_input: /home/liblaf/github/liblaf/apple/exp/2026/05/20/inverse-face/data/20-inverse-face-input.vtu
  output_series: data/20-inverse-face-fresh-smooth-w01-l2-01-mseonly-lr003-beta105.vtu.series
  output_snapshot: data/20-inverse-face-fresh-smooth-w01-l2-01-mseonly-lr003-beta105.png
  output_summary: data/20-inverse-face-fresh-smooth-w01-l2-01-mseonly-lr003-beta105-summary.json
  output_target: /home/liblaf/github/liblaf/apple/exp/2026/05/20/inverse-face/data/20-inverse-face-target.vtu
  smas_stiffness_ratio: 100.0
  stagnation_abs_tol: 1.0e-08
  stagnation_patience: 300
  stagnation_rel_tol: 1.0e-05
  target: /home/liblaf/github/liblaf/apple/exp/2026/05/20/inverse-face/data/10-inverse-face-target.vtu
  target_point_mask: IsFace
  curr_step: 159
exception: 'KeyboardInterrupt

  '
inputs:
- exp/2026/05/20/inverse-face/data/10-inverse-face-input.vtu
- exp/2026/05/20/inverse-face/data/10-inverse-face-target.vtu
outputs:
- exp/2026/05/20/inverse-face/data/20-inverse-face-input.vtu
- exp/2026/05/20/inverse-face/data/20-inverse-face-target.vtu
- exp/2026/05/20/inverse-face/data/20-inverse-face.vtu
- exp/2026/05/20/inverse-face/data/20-inverse-face.vtu.series
- exp/2026/05/20/inverse-face/data/20-inverse-face-summary.json
- exp/2026/05/20/inverse-face/data/20-inverse-face-checkpoint.npz
name: inverse face 515k fresh nu 0.4 smas 1 no clamp
url: https://www.comet.com/liblaf/apple/c0dc5a55b43f4f9d82a3b577d050e445
exp_dir: exp/2026/05/20/inverse-face
cwd: exp/2026/05/20/inverse-face
cmd: /home/liblaf/github/liblaf/apple/.venv/bin/python3 src/20-inverse-face.py --nu
  0.4 --smas-stiffness-ratio 1 --output data/20-inverse-face-fresh-nu04-smas1-noclamp.vtu
  --output-series data/20-inverse-face-fresh-nu04-smas1-noclamp.vtu.series --output-summary
  data/20-inverse-face-fresh-nu04-smas1-noclamp-summary.json --output-snapshot data/20-inverse-face-fresh-nu04-smas1-noclamp.png
  --checkpoint data/20-inverse-face-fresh-nu04-smas1-noclamp-checkpoint.npz
params:
  nu: 0.4
  smas-stiffness-ratio: 1
  output: data/20-inverse-face-fresh-nu04-smas1-noclamp.vtu
  output-series: data/20-inverse-face-fresh-nu04-smas1-noclamp.vtu.series
  output-summary: data/20-inverse-face-fresh-nu04-smas1-noclamp-summary.json
  output-snapshot: data/20-inverse-face-fresh-nu04-smas1-noclamp.png
  checkpoint: data/20-inverse-face-fresh-nu04-smas1-noclamp-checkpoint.npz
  E: 1.0
  activation_l2_weight: 0.1
  activation_smooth_weight: 0.1
  active_fraction_tol: 0.001
  adam_beta1: 0.3
  adam_beta2: 0.9
  adam_eps: 1.0e-08
  adjoint_atol: 0.0
  adjoint_maxiter: 10000
  adjoint_rtol: 0.0005
  failure_patience: 3
  forward_atol: 0.0
  forward_max_steps: 10000
  forward_rtol: 0.0005
  initial_activation_inv: null
  input: /home/liblaf/github/liblaf/apple/exp/2026/05/20/inverse-face/data/10-inverse-face-input.vtu
  inverse_lr: 0.03
  inverse_max_steps: 1000
  inverse_min_steps: 80
  loss_tol: 1.0e-07
  max_point_error_cm: 0.2
  output_input: /home/liblaf/github/liblaf/apple/exp/2026/05/20/inverse-face/data/20-inverse-face-input.vtu
  output_series: data/20-inverse-face-fresh-nu04-smas1-noclamp.vtu.series
  output_snapshot: data/20-inverse-face-fresh-nu04-smas1-noclamp.png
  output_summary: data/20-inverse-face-fresh-nu04-smas1-noclamp-summary.json
  output_target: /home/liblaf/github/liblaf/apple/exp/2026/05/20/inverse-face/data/20-inverse-face-target.vtu
  smas_stiffness_ratio: 1.0
  stagnation_abs_tol: 1.0e-08
  stagnation_patience: 250
  stagnation_rel_tol: 1.0e-05
  target: /home/liblaf/github/liblaf/apple/exp/2026/05/20/inverse-face/data/10-inverse-face-target.vtu
  target_point_mask: IsFace
  curr_step: 112
exception: 'KeyboardInterrupt

  '
inputs:
- exp/2026/05/20/inverse-face/data/10-inverse-face-input.vtu
- exp/2026/05/20/inverse-face/data/10-inverse-face-target.vtu
outputs:
- exp/2026/05/20/inverse-face/data/20-inverse-face-input.vtu
- exp/2026/05/20/inverse-face/data/20-inverse-face-target.vtu
- exp/2026/05/20/inverse-face/data/20-inverse-face.vtu
- exp/2026/05/20/inverse-face/data/20-inverse-face.vtu.series
- exp/2026/05/20/inverse-face/data/20-inverse-face-summary.json
- exp/2026/05/20/inverse-face/data/20-inverse-face-checkpoint.npz
name: inverse face 515k fresh nu 0.4 smas 1 no clamp loose l2
url: https://www.comet.com/liblaf/apple/7e5cd7b88cbb47aca10ab74f18571a3e
exp_dir: exp/2026/05/20/inverse-face
cwd: exp/2026/05/20/inverse-face
cmd: /home/liblaf/github/liblaf/apple/.venv/bin/python3 src/20-inverse-face.py --nu
  0.4 --smas-stiffness-ratio 1 --activation-smooth-weight 0.1 --activation-l2-weight
  1e-2 --output data/20-inverse-face-fresh-nu04-smas1-noclamp-loose-reg.vtu --output-series
  data/20-inverse-face-fresh-nu04-smas1-noclamp-loose-reg.vtu.series --output-summary
  data/20-inverse-face-fresh-nu04-smas1-noclamp-loose-reg-summary.json --output-snapshot
  data/20-inverse-face-fresh-nu04-smas1-noclamp-loose-reg.png --checkpoint data/20-inverse-face-fresh-nu04-smas1-noclamp-loose-reg-checkpoint.npz
params:
  nu: 0.4
  smas-stiffness-ratio: 1
  activation-smooth-weight: 0.1
  activation-l2-weight: 0.01
  output: data/20-inverse-face-fresh-nu04-smas1-noclamp-loose-reg.vtu
  output-series: data/20-inverse-face-fresh-nu04-smas1-noclamp-loose-reg.vtu.series
  output-summary: data/20-inverse-face-fresh-nu04-smas1-noclamp-loose-reg-summary.json
  output-snapshot: data/20-inverse-face-fresh-nu04-smas1-noclamp-loose-reg.png
  checkpoint: data/20-inverse-face-fresh-nu04-smas1-noclamp-loose-reg-checkpoint.npz
  E: 1.0
  activation_l2_weight: 0.01
  activation_smooth_weight: 0.1
  active_fraction_tol: 0.001
  adam_beta1: 0.3
  adam_beta2: 0.9
  adam_eps: 1.0e-08
  adjoint_atol: 0.0
  adjoint_maxiter: 10000
  adjoint_rtol: 0.0005
  failure_patience: 3
  forward_atol: 0.0
  forward_max_steps: 10000
  forward_rtol: 0.0005
  initial_activation_inv: null
  input: /home/liblaf/github/liblaf/apple/exp/2026/05/20/inverse-face/data/10-inverse-face-input.vtu
  inverse_lr: 0.03
  inverse_max_steps: 1000
  inverse_min_steps: 80
  loss_tol: 1.0e-07
  max_point_error_cm: 0.2
  output_input: /home/liblaf/github/liblaf/apple/exp/2026/05/20/inverse-face/data/20-inverse-face-input.vtu
  output_series: data/20-inverse-face-fresh-nu04-smas1-noclamp-loose-reg.vtu.series
  output_snapshot: data/20-inverse-face-fresh-nu04-smas1-noclamp-loose-reg.png
  output_summary: data/20-inverse-face-fresh-nu04-smas1-noclamp-loose-reg-summary.json
  output_target: /home/liblaf/github/liblaf/apple/exp/2026/05/20/inverse-face/data/20-inverse-face-target.vtu
  smas_stiffness_ratio: 1.0
  stagnation_abs_tol: 1.0e-08
  stagnation_patience: 250
  stagnation_rel_tol: 1.0e-05
  target: /home/liblaf/github/liblaf/apple/exp/2026/05/20/inverse-face/data/10-inverse-face-target.vtu
  target_point_mask: IsFace
  curr_step: 50
exception: 'KeyboardInterrupt

  '
inputs:
- exp/2026/05/20/inverse-face/data/10-inverse-face-input.vtu
- exp/2026/05/20/inverse-face/data/10-inverse-face-target.vtu
outputs:
- exp/2026/05/20/inverse-face/data/20-inverse-face-input.vtu
- exp/2026/05/20/inverse-face/data/20-inverse-face-target.vtu
- exp/2026/05/20/inverse-face/data/20-inverse-face.vtu
- exp/2026/05/20/inverse-face/data/20-inverse-face.vtu.series
- exp/2026/05/20/inverse-face/data/20-inverse-face-summary.json
- exp/2026/05/20/inverse-face/data/20-inverse-face-checkpoint.npz
…se reg

name: inverse face 515k fresh nu 0.49 smas 1 no clamp super loose reg
url: https://www.comet.com/liblaf/apple/f1f986bbef454961a8532dcc9b219001
exp_dir: exp/2026/05/20/inverse-face
cwd: exp/2026/05/20/inverse-face
cmd: /home/liblaf/github/liblaf/apple/.venv/bin/python3 src/20-inverse-face.py --nu
  0.49 --smas-stiffness-ratio 1 --activation-smooth-weight 1e-3 --activation-l2-weight
  1e-5 --output data/20-inverse-face-fresh-nu049-smas1-noclamp-super-loose-reg.vtu
  --output-series data/20-inverse-face-fresh-nu049-smas1-noclamp-super-loose-reg.vtu.series
  --output-summary data/20-inverse-face-fresh-nu049-smas1-noclamp-super-loose-reg-summary.json
  --output-snapshot data/20-inverse-face-fresh-nu049-smas1-noclamp-super-loose-reg.png
  --checkpoint data/20-inverse-face-fresh-nu049-smas1-noclamp-super-loose-reg-checkpoint.npz
params:
  nu: 0.49
  smas-stiffness-ratio: 1
  activation-smooth-weight: 0.001
  activation-l2-weight: 1.0e-05
  output: data/20-inverse-face-fresh-nu049-smas1-noclamp-super-loose-reg.vtu
  output-series: data/20-inverse-face-fresh-nu049-smas1-noclamp-super-loose-reg.vtu.series
  output-summary: data/20-inverse-face-fresh-nu049-smas1-noclamp-super-loose-reg-summary.json
  output-snapshot: data/20-inverse-face-fresh-nu049-smas1-noclamp-super-loose-reg.png
  checkpoint: data/20-inverse-face-fresh-nu049-smas1-noclamp-super-loose-reg-checkpoint.npz
  E: 1.0
  activation_l2_weight: 1.0e-05
  activation_smooth_weight: 0.001
  active_fraction_tol: 0.001
  adam_beta1: 0.3
  adam_beta2: 0.9
  adam_eps: 1.0e-08
  adjoint_atol: 0.0
  adjoint_maxiter: 10000
  adjoint_rtol: 0.0005
  failure_patience: 3
  forward_atol: 0.0
  forward_max_steps: 10000
  forward_rtol: 0.0005
  initial_activation_inv: null
  input: /home/liblaf/github/liblaf/apple/exp/2026/05/20/inverse-face/data/10-inverse-face-input.vtu
  inverse_lr: 0.03
  inverse_max_steps: 1000
  inverse_min_steps: 80
  loss_tol: 1.0e-07
  max_point_error_cm: 0.2
  output_input: /home/liblaf/github/liblaf/apple/exp/2026/05/20/inverse-face/data/20-inverse-face-input.vtu
  output_series: data/20-inverse-face-fresh-nu049-smas1-noclamp-super-loose-reg.vtu.series
  output_snapshot: data/20-inverse-face-fresh-nu049-smas1-noclamp-super-loose-reg.png
  output_summary: data/20-inverse-face-fresh-nu049-smas1-noclamp-super-loose-reg-summary.json
  output_target: /home/liblaf/github/liblaf/apple/exp/2026/05/20/inverse-face/data/20-inverse-face-target.vtu
  smas_stiffness_ratio: 1.0
  stagnation_abs_tol: 1.0e-08
  stagnation_patience: 250
  stagnation_rel_tol: 1.0e-05
  target: /home/liblaf/github/liblaf/apple/exp/2026/05/20/inverse-face/data/10-inverse-face-target.vtu
  target_point_mask: IsFace
  curr_step: 286
inputs:
- exp/2026/05/20/inverse-face/data/10-inverse-face-input.vtu
- exp/2026/05/20/inverse-face/data/10-inverse-face-target.vtu
outputs:
- exp/2026/05/20/inverse-face/data/20-inverse-face-input.vtu
- exp/2026/05/20/inverse-face/data/20-inverse-face-target.vtu
- exp/2026/05/20/inverse-face/data/20-inverse-face.vtu
- exp/2026/05/20/inverse-face/data/20-inverse-face.vtu.series
- exp/2026/05/20/inverse-face/data/20-inverse-face-summary.json
- exp/2026/05/20/inverse-face/data/20-inverse-face-checkpoint.npz
….375

name: inverse face 515k fresh default loose regularization nu 0.375
url: https://www.comet.com/liblaf/apple/c2f9b869093c477abb555e5476e2f754
exp_dir: exp/2026/05/20/inverse-face
cwd: exp/2026/05/20/inverse-face
cmd: /home/liblaf/github/liblaf/apple/.venv/bin/python3 src/20-inverse-face.py --nu
  0.375 --activation-smooth-weight 1e-3 --activation-l2-weight 1e-5 --output data/20-inverse-face-fresh-default-nu0375.vtu
  --output-series data/20-inverse-face-fresh-default-nu0375.vtu.series --output-summary
  data/20-inverse-face-fresh-default-nu0375-summary.json --output-snapshot data/20-inverse-face-fresh-default-nu0375.png
  --checkpoint data/20-inverse-face-fresh-default-nu0375-checkpoint.npz
params:
  nu: 0.375
  activation-smooth-weight: 0.001
  activation-l2-weight: 1.0e-05
  output: data/20-inverse-face-fresh-default-nu0375.vtu
  output-series: data/20-inverse-face-fresh-default-nu0375.vtu.series
  output-summary: data/20-inverse-face-fresh-default-nu0375-summary.json
  output-snapshot: data/20-inverse-face-fresh-default-nu0375.png
  checkpoint: data/20-inverse-face-fresh-default-nu0375-checkpoint.npz
  E: 1.0
  activation_l2_weight: 1.0e-05
  activation_smooth_weight: 0.001
  active_fraction_tol: 0.001
  adam_beta1: 0.3
  adam_beta2: 0.9
  adam_eps: 1.0e-08
  adjoint_atol: 0.0
  adjoint_maxiter: 10000
  adjoint_rtol: 0.0005
  failure_patience: 3
  forward_atol: 0.0
  forward_max_steps: 10000
  forward_rtol: 0.0005
  initial_activation_inv: null
  input: /home/liblaf/github/liblaf/apple/exp/2026/05/20/inverse-face/data/10-inverse-face-input.vtu
  inverse_lr: 0.03
  inverse_max_steps: 1000
  inverse_min_steps: 80
  loss_tol: 1.0e-07
  max_point_error_cm: 0.2
  output_input: /home/liblaf/github/liblaf/apple/exp/2026/05/20/inverse-face/data/20-inverse-face-input.vtu
  output_series: data/20-inverse-face-fresh-default-nu0375.vtu.series
  output_snapshot: data/20-inverse-face-fresh-default-nu0375.png
  output_summary: data/20-inverse-face-fresh-default-nu0375-summary.json
  output_target: /home/liblaf/github/liblaf/apple/exp/2026/05/20/inverse-face/data/20-inverse-face-target.vtu
  smas_stiffness_ratio: 100.0
  stagnation_abs_tol: 1.0e-08
  stagnation_patience: 250
  stagnation_rel_tol: 1.0e-05
  target: /home/liblaf/github/liblaf/apple/exp/2026/05/20/inverse-face/data/10-inverse-face-target.vtu
  target_point_mask: IsFace
  curr_step: 384
exception: 'KeyboardInterrupt

  '
inputs:
- exp/2026/05/20/inverse-face/data/10-inverse-face-input.vtu
- exp/2026/05/20/inverse-face/data/10-inverse-face-target.vtu
outputs:
- exp/2026/05/20/inverse-face/data/20-inverse-face-input.vtu
- exp/2026/05/20/inverse-face/data/20-inverse-face-target.vtu
- exp/2026/05/20/inverse-face/data/20-inverse-face.vtu
- exp/2026/05/20/inverse-face/data/20-inverse-face.vtu.series
- exp/2026/05/20/inverse-face/data/20-inverse-face-summary.json
- exp/2026/05/20/inverse-face/data/20-inverse-face-checkpoint.npz
….375 smas stiffness 1

name: inverse face 515k fresh default loose regularization nu 0.375 smas stiffness
  1
url: https://www.comet.com/liblaf/apple/4684d9226980479e94efbea8d94a8ef6
exp_dir: exp/2026/05/20/inverse-face
cwd: exp/2026/05/20/inverse-face
cmd: /home/liblaf/github/liblaf/apple/.venv/bin/python3 src/20-inverse-face.py --nu
  0.375 --smas-stiffness-ratio 1 --activation-smooth-weight 1e-3 --activation-l2-weight
  1e-5 --output data/20-inverse-face-fresh-default-nu0375-smas1.vtu --output-series
  data/20-inverse-face-fresh-default-nu0375-smas1.vtu.series --output-summary data/20-inverse-face-fresh-default-nu0375-smas1-summary.json
  --output-snapshot data/20-inverse-face-fresh-default-nu0375-smas1.png --checkpoint
  data/20-inverse-face-fresh-default-nu0375-smas1-checkpoint.npz
params:
  nu: 0.375
  smas-stiffness-ratio: 1
  activation-smooth-weight: 0.001
  activation-l2-weight: 1.0e-05
  output: data/20-inverse-face-fresh-default-nu0375-smas1.vtu
  output-series: data/20-inverse-face-fresh-default-nu0375-smas1.vtu.series
  output-summary: data/20-inverse-face-fresh-default-nu0375-smas1-summary.json
  output-snapshot: data/20-inverse-face-fresh-default-nu0375-smas1.png
  checkpoint: data/20-inverse-face-fresh-default-nu0375-smas1-checkpoint.npz
  E: 1.0
  activation_l2_weight: 1.0e-05
  activation_smooth_weight: 0.001
  active_fraction_tol: 0.001
  adam_beta1: 0.3
  adam_beta2: 0.9
  adam_eps: 1.0e-08
  adjoint_atol: 0.0
  adjoint_maxiter: 10000
  adjoint_rtol: 0.0005
  failure_patience: 3
  forward_atol: 0.0
  forward_max_steps: 10000
  forward_rtol: 0.0005
  initial_activation_inv: null
  input: /home/liblaf/github/liblaf/apple/exp/2026/05/20/inverse-face/data/10-inverse-face-input.vtu
  inverse_lr: 0.03
  inverse_max_steps: 1000
  inverse_min_steps: 80
  loss_tol: 1.0e-07
  max_point_error_cm: 0.2
  output_input: /home/liblaf/github/liblaf/apple/exp/2026/05/20/inverse-face/data/20-inverse-face-input.vtu
  output_series: data/20-inverse-face-fresh-default-nu0375-smas1.vtu.series
  output_snapshot: data/20-inverse-face-fresh-default-nu0375-smas1.png
  output_summary: data/20-inverse-face-fresh-default-nu0375-smas1-summary.json
  output_target: /home/liblaf/github/liblaf/apple/exp/2026/05/20/inverse-face/data/20-inverse-face-target.vtu
  smas_stiffness_ratio: 1.0
  stagnation_abs_tol: 1.0e-08
  stagnation_patience: 250
  stagnation_rel_tol: 1.0e-05
  target: /home/liblaf/github/liblaf/apple/exp/2026/05/20/inverse-face/data/10-inverse-face-target.vtu
  target_point_mask: IsFace
  curr_step: 289
exception: 'KeyboardInterrupt

  '
inputs:
- exp/2026/05/20/inverse-face/data/10-inverse-face-input.vtu
- exp/2026/05/20/inverse-face/data/10-inverse-face-target.vtu
outputs:
- exp/2026/05/20/inverse-face/data/20-inverse-face-input.vtu
- exp/2026/05/20/inverse-face/data/20-inverse-face-target.vtu
- exp/2026/05/20/inverse-face/data/20-inverse-face.vtu
- exp/2026/05/20/inverse-face/data/20-inverse-face.vtu.series
- exp/2026/05/20/inverse-face/data/20-inverse-face-summary.json
- exp/2026/05/20/inverse-face/data/20-inverse-face-checkpoint.npz
Refresh the May 20 inverse-face run artifacts with new nu049 SMAS regularization outputs and figures, replacing the previous default nu04 rerun data.
name: transfer activation 3152k forward
url: https://www.comet.com/liblaf/apple/1708acd3c5f34abf8276c32b4d73351a
exp_dir: exp/2026/05/20/inverse-face
cwd: exp/2026/05/20/inverse-face
cmd: /home/liblaf/github/liblaf/apple/.venv/bin/python3 src/30-transfer-activation-3152k.py
params:
  E: 1.0
  active_fraction_tol: 0.001
  expression: Expression000
  fixed_point_mask: IsCranium
  forward_atol: 0.0
  forward_max_steps: 10000
  forward_rtol: 0.0005
  nu: 0.49
  output: /home/liblaf/github/liblaf/apple/exp/2026/05/20/inverse-face/data/30-transfer-activation-3152k.vtu
  output_input: /home/liblaf/github/liblaf/apple/exp/2026/05/20/inverse-face/data/30-transfer-activation-3152k-input.vtu
  output_series: /home/liblaf/github/liblaf/apple/exp/2026/05/20/inverse-face/data/30-transfer-activation-3152k.vtu.series
  output_summary: /home/liblaf/github/liblaf/apple/exp/2026/05/20/inverse-face/data/30-transfer-activation-3152k-summary.json
  smas_stiffness_ratio: 100.0
  solved: /home/liblaf/github/liblaf/apple/exp/2026/05/20/inverse-face/data/20-inverse-face-smooth-w1-lr003.vtu.series
  solved_frame_index: -1
  source: /home/liblaf/github/liblaf/melon/exp/2025/04/30/human-head-anatomy/data/41-expression-3152k.vtu
  target_point_mask: IsFace
  target_scale: 1.0
  transfer_chunk_size: 200000
  transfer_k: 4
  transfer_power: 2.0
inputs:
- /home/liblaf/github/liblaf/melon/exp/2025/04/30/human-head-anatomy/data/41-expression-3152k.vtu
- exp/2026/05/20/inverse-face/data/20-inverse-face-smooth-w1-lr003.vtu.series
outputs:
- exp/2026/05/20/inverse-face/data/30-transfer-activation-3152k-input.vtu
- exp/2026/05/20/inverse-face/data/30-transfer-activation-3152k.vtu
- exp/2026/05/20/inverse-face/data/30-transfer-activation-3152k.vtu.series
- exp/2026/05/20/inverse-face/data/30-transfer-activation-3152k-summary.json
Use disjoint material fractions for inverse-face preparation and transfer
runs so muscle tets receive active stiff material, SMAS-only regions receive
passive stiff material, and background remains passive with the base modulus.
@liblaf-copier liblaf-copier Bot added automerge Merge the pull request once unit tests and other checks pass. copier labels Jun 6, 2026
@liblaf-mega-linter

liblaf-mega-linter Bot commented Jun 6, 2026

Copy link
Copy Markdown

⚠️MegaLinter analysis: Success with warnings

Descriptor Linter Files Fixed Errors Warnings Elapsed time
✅ BASH shellcheck 2 0 0 0.49s
✅ BASH shfmt 2 0 0 0 1.8s
⚠️ COPYPASTE jscpd yes 464 no 9.69s
✅ JSON prettier 19 15 0 0 2.76s
✅ JSON v8r 19 0 0 5.38s
✅ MARKDOWN rumdl 28 0 0 0 1.81s
⚠️ PYTHON ruff yes yes 47 no 1.18s
✅ PYTHON ruff-format yes yes no no 0.17s
✅ REPOSITORY git_diff yes no no 2.23s
⚠️ SPELL cspell yes 15 no 7.2s

Detailed Issues

⚠️ SPELL / cspell - 15 errors
.github/workflows/release-pr.yaml:72:15     - Unknown word (orhun)      -- uses: orhun/git-cliff-action@f5
	 Suggestions: [oahu, oran, ordn, oren, orin]
.github/workflows/release-pr.yaml:80:15     - Unknown word (orhun)      -- uses: orhun/git-cliff-action@f5
	 Suggestions: [oahu, oran, ordn, oren, orin]
exp/2026/05/13/toy/data/30-inverse-activation-diff-forward-no-collision-summary.json:13:4      - Unknown word (bbox)       -- "bbox_diagonal": 1.732050
	 Suggestions: [box, mbox, vbox, xbox, Xbox]
exp/2026/05/13/toy/data/40-inverse-activation-diff-forward-collision-summary.json:17:12     - Unknown word (atol)       -- "forward_atol": 0.001,
	 Suggestions: [atob, atom, aton, atop, awol]
exp/2026/05/13/toy/data/40-inverse-activation-diff-forward-collision-summary.json:19:4      - Unknown word (bbox)       -- "bbox_diagonal": 2.872281
	 Suggestions: [box, mbox, vbox, xbox, Xbox]
exp/2026/05/13/toy/data/41-inverse-active-tet-activation-diff-forward-collision-summary.json:23:12     - Unknown word (atol)       -- "forward_atol": 0.001,
	 Suggestions: [atob, atom, aton, atop, awol]
exp/2026/05/13/toy/data/41-inverse-active-tet-activation-diff-forward-collision-summary.json:29:4      - Unknown word (bbox)       -- "bbox_diagonal": 2.872281
	 Suggestions: [box, mbox, vbox, xbox, Xbox]
exp/2026/05/13/toy/src/20-smas-layer-bottom-force-collision.py:151:22    - Unknown word (Efat)       -- mesh.field_data["Efat"] = np.asarray([cfg
	 Suggestions: [Efta, Feat, Erat, Eat, Eft]
exp/2026/05/13/toy/src/20-smas-layer-bottom-force-collision.py:152:22    - Unknown word (Esmas)      -- mesh.field_data["Esmas"] = np.asarray([cfg
	 Suggestions: [Smas, Seams, Seas, edams, Edams]
exp/2026/05/20/inverse-face/docs/20-inverse-face.md:42:38     - Unknown word (atol)       -- tolerance: `rtol=0.0005`, `atol=0`
	 Suggestions: [atob, atom, aton, atop, awol]
exp/2026/05/20/inverse-face/docs/20-inverse-face.md:43:38     - Unknown word (atol)       -- tolerance: `rtol=0.0005`, `atol=0`
	 Suggestions: [atob, atom, aton, atop, awol]
exp/2026/05/20/inverse-face/docs/30-transfer-activation-3152k.md:75:11     - Unknown word (atol)       -- forward_atol: 0.0
	 Suggestions: [atob, atom, aton, atop, awol]
exp/2026/05/20/inverse-face/docs/31-transfer-activation-3152k-smas1.md:72:11     - Unknown word (atol)       -- forward_atol: 0.0
	 Suggestions: [atob, atom, aton, atop, awol]
src/liblaf/apple/inverse/_diff_forward.py:92:9      - Unknown word (rprecondition) -- def rprecondition(self, p_free: Free)
	 Suggestions: [precondition, preCondition, PRECONDITION, recondition, rpreconditioner]
src/liblaf/apple/inverse/_diff_forward.py:99:21     - Unknown word (rprecondition) -- return self.rprecondition(p_free)
	 Suggestions: [precondition, preCondition, PRECONDITION, recondition, rpreconditioner]
CSpell: Files checked: 320, skipped: 5, Issues found: 15 in 9 files.


You can skip this misspellings by defining the following .cspell.json file at the root of your repository
Of course, please correct real typos before :)

{
    "version": "0.2",
    "language": "en",
    "ignorePaths": [
        "**/node_modules/**",
        "**/vscode-extension/**",
        "**/.git/**",
        "**/.pnpm-lock.json",
        ".vscode",
        "package-lock.json",
        "megalinter-reports"
    ],
    "words": [
        "Efat",
        "Esmas",
        "atol",
        "bbox",
        "orhun",
        "rprecondition"
    ]
}


You can also copy-paste megalinter-reports/LINTER_DEFAULT at the root of your repository
⚠️ COPYPASTE / jscpd - 464 errors
inverse-segement/src/30-inverse.py [138:39 - 242:24]

Clone found (python):
 - exp/2025/08/27/inverse/src/20-forward.py [1:1 - 29:42] (28 lines, 244 tokens)
   exp/2025/08/27/inverse-segement/src/20-forward.py [1:1 - 29:43]

Clone found (python):
 - exp/2025/08/27/inverse/src/20-forward.py [33:40 - 51:24] (18 lines, 191 tokens)
   exp/2025/08/27/inverse-segement/src/20-forward.py [33:30 - 51:24]

Clone found (python):
 - exp/2025/08/27/inverse/src/10-gen.py [32:5 - 39:24] (7 lines, 85 tokens)
   exp/2025/08/27/inverse-segement/src/10-gen.py [46:5 - 53:24]

Clone found (python):
 - exp/2025/07/30/phace/wind/main.py [126:5 - 136:14] (10 lines, 144 tokens)
   exp/2025/07/30/dynamics/collision/inter-collision/main.py [132:84 - 142:15]

Clone found (python):
 - exp/2025/07/30/phace/wind/main.py [139:9 - 152:46] (13 lines, 156 tokens)
   exp/2025/07/30/dynamics/collision/inter-collision/main.py [142:9 - 155:46]

Clone found (python):
 - exp/2025/07/30/phace/open-mouth/main.py [9:1 - 19:13] (10 lines, 102 tokens)
   exp/2025/07/30/phace/wind/main.py [8:1 - 18:12]

Clone found (python):
 - exp/2025/07/30/phace/open-mouth/main.py [24:5 - 36:14] (12 lines, 94 tokens)
   exp/2025/07/30/dynamics/collision/collision-bunny-bunny/main.py [19:5 - 31:9]

Clone found (python):
 - exp/2025/07/30/phace/open-mouth/main.py [25:21 - 55:12] (30 lines, 315 tokens)
   exp/2025/07/30/phace/wind/main.py [30:19 - 60:15]

Clone found (python):
 - exp/2025/07/30/phace/open-mouth/main.py [95:85 - 105:33] (10 lines, 148 tokens)
   exp/2025/07/30/dynamics/collision/inter-collision/main.py [132:84 - 136:38]

Clone found (python):
 - exp/2025/07/30/phace/open-mouth/main.py [105:88 - 119:25] (14 lines, 153 tokens)
   exp/2025/07/30/phace/wind/main.py [138:9 - 155:23]

Clone found (python):
 - exp/2025/07/30/phace/grin/main.py [1:1 - 12:59] (11 lines, 103 tokens)
   exp/2025/07/30/phace/wind/main.py [1:1 - 12:60]

Clone found (python):
 - exp/2025/07/30/phace/grin/main.py [19:5 - 36:12] (17 lines, 142 tokens)
   exp/2025/07/30/phace/open-mouth/main.py [20:5 - 42:12]

Clone found (python):
 - exp/2025/07/30/phace/grin/main.py [101:5 - 107:45] (6 lines, 74 tokens)
   exp/2025/07/30/dynamics/collision/inter-collision/main.py [132:84 - 138:36]

Clone found (python):
 - exp/2025/07/30/phace/dynamics/main.py [1:1 - 14:29] (13 lines, 106 tokens)
   exp/2025/07/30/phace/wind/main.py [1:1 - 15:6]

Clone found (python):
 - exp/2025/07/30/phace/dynamics/main.py [35:5 - 53:37] (18 lines, 164 tokens)
   exp/2025/07/30/phace/wind/main.py [32:5 - 44:44]

Clone found (python):
 - exp/2025/07/30/phace/dynamics/main.py [53:37 - 66:12] (13 lines, 146 tokens)
   exp/2025/07/30/phace/grin/main.py [44:44 - 56:11]

Clone found (python):
 - exp/2025/07/30/phace/dynamics/main.py [90:54 - 97:67] (7 lines, 77 tokens)
   exp/2025/07/30/phace/grin/main.py [90:27 - 97:67]

Clone found (python):
 - exp/2025/07/30/phace/dynamics/main.py [107:5 - 117:13] (10 lines, 142 tokens)
   exp/2025/07/30/dynamics/collision/inter-collision/main.py [132:84 - 111:26]

Clone found (python):
 - exp/2025/07/30/phace/dynamics/main.py [118:81 - 126:43] (8 lines, 101 tokens)
   exp/2025/07/30/phace/grin/main.py [112:77 - 120:41]

Clone found (python):
 - exp/2025/07/30/phace/collide-ball/main.py [9:1 - 18:26] (9 lines, 95 tokens)
   exp/2025/07/30/phace/wind/main.py [9:1 - 19:26]

Clone found (python):
 - exp/2025/07/30/phace/collide-ball/main.py [12:60 - 35:40] (23 lines, 195 tokens)
   exp/2025/07/30/phace/grin/main.py [12:52 - 36:47]

Clone found (python):
 - exp/2025/07/30/phace/collide-ball/main.py [35:40 - 42:66] (7 lines, 122 tokens)
   exp/2025/07/30/phace/wind/main.py [41:47 - 48:64]

Clone found (python):
 - exp/2025/07/30/phace/close-mouth/main.py [1:1 - 22:12] (21 lines, 180 tokens)
   exp/2025/07/30/phace/open-mouth/main.py [1:1 - 21:10]

Clone found (python):
 - exp/2025/07/30/phace/close-mouth/main.py [29:5 - 57:12] (28 lines, 311 tokens)
   exp/2025/07/30/phace/wind/main.py [32:5 - 60:15]

Clone found (python):
 - exp/2025/07/30/phace/close-mouth/main.py [101:5 - 140:21] (39 lines, 450 tokens)
   exp/2025/07/30/phace/open-mouth/main.py [55:5 - 124:9]

Clone found (python):
 - exp/2025/07/30/phace/close-mouth/main.py [140:47 - 165:46] (25 lines, 356 tokens)
   exp/2025/07/30/phace/open-mouth/main.py [94:46 - 155:46]

Clone found (python):
 - exp/2025/07/30/dynamics/free-falling/main.py [25:21 - 58:8] (33 lines, 358 tokens)
   exp/2025/07/30/dynamics/collision/collision-bunny/main.py [24:19 - 57:11]

Clone found (python):
 - exp/2025/07/30/dynamics/free-falling/main.py [78:5 - 84:11] (6 lines, 86 tokens)
   exp/2025/07/30/dynamics/collision/collision-bunny/main.py [75:5 - 81:11]

Clone found (python):
 - exp/2025/07/30/dynamics/free-falling/main.py [137:5 - 151:14] (14 lines, 138 tokens)
   exp/2025/07/30/dynamics/collision/collision-bunny-sphere/main.py [69:5 - 83:14]

Clone found (python):
 - exp/2025/04/30/fat-muscle/src/20-simulate.py [17:5 - 30:35] (13 lines, 138 tokens)
   exp/2025/04/30/human-head/src/10-simulate.py [18:5 - 31:37]

Clone found (python):
 - exp/2025/04/30/fat-muscle/src/20-simulate.py [48:43 - 58:61] (10 lines, 136 tokens)
   exp/2025/04/30/human-head/src/10-simulate.py [47:56 - 57:63]

Clone found (python):
 - exp/2025/04/30/fat-muscle/src/20-simulate.py [59:60 - 72:3] (13 lines, 107 tokens)
   exp/2025/04/30/human-head/src/10-simulate.py [58:62 - 71:4]

Clone found (python):
 - exp/2025/04/30/cubic/src/10-gen.py [21:54 - 44:35] (23 lines, 196 tokens)
   exp/2025/04/30/human-head/src/10-simulate.py [24:76 - 46:40]

Clone found (python):
 - exp/2025/04/30/cubic/src/10-gen.py [44:66 - 71:24] (27 lines, 303 tokens)
   exp/2025/04/30/fat-muscle/src/20-simulate.py [46:74 - 73:24]

Clone found (python):
 - src/liblaf/apple/warp/fem/_stable_neo_hookean_active.py [57:1 - 63:31] (6 lines, 83 tokens)
   src/liblaf/apple/warp/fem/_stable_neo_hookean_active.py [36:67 - 42:13]

Clone found (python):
 - src/liblaf/apple/warp/fem/_stable_neo_hookean_active.py [81:46 - 93:11] (12 lines, 171 tokens)
   src/liblaf/apple/warp/fem/_stable_neo_hookean_active.py [36:35 - 69:48]

Clone found (python):
 - src/liblaf/apple/warp/fem/_stable_neo_hookean_active.py [102:36 - 108:6] (6 lines, 82 tokens)
   src/liblaf/apple/warp/fem/_stable_neo_hookean_active.py [21:28 - 26:7]

Clone found (python):
 - src/liblaf/apple/warp/fem/_stable_neo_hookean_active.py [103:14 - 116:12] (13 lines, 166 tokens)
   src/liblaf/apple/warp/fem/_stable_neo_hookean_active.py [57:11 - 94:12]

Clone found (python):
 - src/liblaf/apple/warp/fem/_stable_neo_hookean.py [25:18 - 35:7] (10 lines, 126 tokens)
   src/liblaf/apple/warp/fem/_stable_neo_hookean_active.py [27:18 - 37:10]

Clone found (python):
 - src/liblaf/apple/warp/fem/_stable_neo_hookean.py [74:78 - 84:12] (10 lines, 127 tokens)
   src/liblaf/apple/warp/fem/_stable_neo_hookean.py [53:1 - 63:48]

Clone found (python):
 - src/liblaf/apple/warp/fem/_stable_neo_hookean.py [93:14 - 103:12] (10 lines, 121 tokens)
   src/liblaf/apple/warp/fem/_stable_neo_hookean.py [53:11 - 63:48]

Clone found (python):
 - src/liblaf/apple/warp/fem/_stable_neo_hookean.py [116:43 - 150:6] (34 lines, 323 tokens)
   src/liblaf/apple/warp/fem/_stable_neo_hookean_active.py [135:10 - 169:6]

Clone found (python):
 - src/liblaf/apple/warp/fem/_neo_hookean.py [1:1 - 28:18] (27 lines, 251 tokens)
   src/liblaf/apple/warp/fem/_stable_neo_hookean.py [1:1 - 28:17]

Clone found (python):
 - src/liblaf/apple/warp/fem/_neo_hookean.py [29:51 - 39:17] (10 lines, 105 tokens)
   src/liblaf/apple/warp/fem/_stable_neo_hookean.py [29:58 - 39:17]

Clone found (python):
 - src/liblaf/apple/warp/fem/_neo_hookean.py [39:44 - 60:17] (21 lines, 193 tokens)
   src/liblaf/apple/warp/fem/_stable_neo_hookean.py [39:47 - 60:17]

Clone found (python):
 - src/liblaf/apple/warp/fem/_neo_hookean.py [62:63 - 84:12] (22 lines, 280 tokens)
   src/liblaf/apple/warp/fem/_stable_neo_hookean.py [62:22 - 63:48]

Clone found (python):
 - src/liblaf/apple/warp/fem/_neo_hookean.py [83:63 - 103:12] (20 lines, 280 tokens)
   src/liblaf/apple/warp/fem/_stable_neo_hookean.py [83:22 - 63:48]

Clone found (python):
 - src/liblaf/apple/warp/fem/_neo_hookean.py [102:63 - 110:17] (8 lines, 92 tokens)
   src/liblaf/apple/warp/fem/_stable_neo_hookean.py [102:22 - 110:23]

Clone found (python):
 - src/liblaf/apple/warp/fem/_neo_hookean.py [110:17 - 150:6] (40 lines, 380 tokens)
   src/liblaf/apple/warp/fem/_stable_neo_hookean.py [110:23 - 169:6]

Clone found (python):
 - src/liblaf/apple/warp/fem/_base.py [189:37 - 196:14] (7 lines, 90 tokens)
   src/liblaf/apple/warp/fem/_base.py [166:40 - 173:19]

Clone found (python):
 - src/liblaf/apple/warp/fem/_base.py [211:31 - 218:16] (7 lines, 92 tokens)
   src/liblaf/apple/warp/fem/_base.py [166:31 - 173:19]

Clone found (python):
 - src/liblaf/apple/warp/fem/_base.py [235:36 - 243:22] (8 lines, 108 tokens)
   src/liblaf/apple/warp/fem/_base.py [166:40 - 197:19]

Clone found (python):
 - src/liblaf/apple/warp/fem/_base.py [266:9 - 272:19] (6 lines, 86 tokens)
   src/liblaf/apple/warp/fem/_base.py [167:9 - 173:19]

Clone found (python):
 - src/liblaf/apple/warp/fem/_base.py [292:14 - 300:19] (8 lines, 102 tokens)
   src/liblaf/apple/warp/fem/_base.py [262:14 - 270:22]

Clone found (python):
 - src/liblaf/apple/warp/fem/_base.py [327:9 - 334:19] (7 lines, 103 tokens)
   src/liblaf/apple/warp/fem/_base.py [296:9 - 303:19]

Clone found (python):
 - src/liblaf/apple/warp/fem/_arap.py [7:33 - 22:7] (15 lines, 106 tokens)
   src/liblaf/apple/warp/fem/_stable_neo_hookean.py [7:41 - 22:7]

Clone found (python):
 - src/liblaf/apple/warp/fem/_arap.py [89:53 - 121:6] (32 lines, 288 tokens)
   src/liblaf/apple/warp/fem/_stable_neo_hookean_active.py [137:55 - 169:6]

Clone found (python):
 - exp/2025/07/30/static/stretch.py [12:5 - 19:52] (7 lines, 105 tokens)
   exp/2025/07/30/static/random/main.py [19:5 - 25:53]

Clone found (python):
 - exp/2025/07/30/static/stretch.py [28:9 - 39:30] (11 lines, 124 tokens)
   exp/2025/07/30/static/random/main.py [40:9 - 51:35]

Clone found (python):
 - exp/2025/07/30/static/stretch.py [49:1 - 54:10] (5 lines, 83 tokens)
   exp/2025/07/30/static/random/main.py [60:44 - 65:10]

Clone found (python):
 - exp/2025/07/30/static/stretch.py [67:5 - 77:14] (10 lines, 115 tokens)
   exp/2025/07/30/static/random/main.py [73:5 - 83:10]

Clone found (python):
 - tests/forward/test_static_simulation.py [77:31 - 85:11] (8 lines, 80 tokens)
   exp/2026/05/06/toy/src/10-stretched-cylinder.py [84:43 - 92:17]

Clone found (python):
 - benches/test_aggregation.py [115:9 - 129:11] (14 lines, 161 tokens)
   benches/test_aggregation.py [68:88 - 80:92]

Clone found (python):
 - benches/bench_pncg_branching_backends.py [180:20 - 192:8] (12 lines, 87 tokens)
   benches/bench_pncg_branching_backends.py [141:14 - 153:9]

Clone found (python):
 - benches/bench_pncg_branching_backends.py [347:9 - 357:11] (10 lines, 94 tokens)
   benches/bench_pncg_branching_backends.py [279:9 - 289:13]

Clone found (python):
 - benches/bench_pncg_branching_backends.py [459:40 - 481:6] (22 lines, 172 tokens)
   benches/bench_pncg_branching_backends.py [413:34 - 435:18]

Clone found (python):
 - benches/bench_pncg_branching_backends.py [649:25 - 663:22] (14 lines, 159 tokens)
   benches/bench_pncg_branching_backends.py [475:23 - 489:25]

┌────────┬────────────────┬─────────────┬──────────────┬──────────────┬──────────────────┬───────────────────┐
│ Format │ Files analyzed │ Total lines │ Total tokens │ Clones found │ Duplicated lines │ Duplicated tokens │
├────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤
│ python │ 190            │ 28966       │ 294565       │ 464          │ 11952 (41.26%)   │ 125342 (42.55%)   │
├────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤
│ csv    │ 1              │ 15          │ 813          │ 0            │ 0 (0%)           │ 0 (0%)            │
├────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤
│ bash   │ 2              │ 45          │ 136          │ 0            │ 0 (0%)           │ 0 (0%)            │
├────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤
│ toml   │ 8              │ 933         │ 4016         │ 0            │ 0 (0%)           │ 0 (0%)            │
├────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤
│ Total: │ 201            │ 29959       │ 299530       │ 464          │ 11952 (39.89%)   │ 125342 (41.85%)   │
└────────┴────────────────┴─────────────┴──────────────┴──────────────┴──────────────────┴───────────────────┘
Found 464 clones.
HTML report saved to megalinter-reports/copy-paste/html/
ERROR: jscpd found too many duplicates (39.89%) over threshold (0%)
Error: ERROR: jscpd found too many duplicates (39.89%) over threshold (0%)
    at ThresholdReporter.report (/node-deps/node_modules/@jscpd/finder/dist/index.js:615:13)
    at /node-deps/node_modules/@jscpd/finder/dist/index.js:109:18
    at Array.forEach (<anonymous>)
    at /node-deps/node_modules/@jscpd/finder/dist/index.js:108:22
    at async /node-deps/node_modules/jscpd/dist/bin/jscpd.js:9:5

(Truncated to last 13333 characters out of 92386)
⚠️ PYTHON / ruff - 47 errors
able first
   --> exp/2026/01/28/smas/src/20-forward-ext-force-stable-neo-hookean-ramped.py:206:21
    |
204 |               if not stage_result.solver_result.success:
205 |                   raise RuntimeError(
206 | /                     "forward stage failed at "
207 | |                     f"force scale {force_scale:g} with status "
208 | |                     f"{stage_result.solver_result.status}"
    | |__________________________________________________________^
209 |                   )
210 |               cherries.set_step(stage_index)
    |
help: Assign to variable; remove f-string literal

RUF046 Value being cast to `int` is already an integer
  --> exp/2026/01/28/smas/src/20-forward-ext-force-stable-neo-hookean-smas-only.py:48:20
   |
46 | def format_lambda_value(lambda_value: float) -> str:
47 |     if np.isclose(lambda_value, round(lambda_value)):
48 |         return str(int(round(lambda_value)))
   |                    ^^^^^^^^^^^^^^^^^^^^^^^^
49 |     mantissa, exponent = f"{lambda_value:.0e}".split("e")
50 |     return f"{mantissa}e{int(exponent)}"
   |
help: Remove unnecessary `int` call

TRY003 Avoid specifying long messages outside the exception class
  --> exp/2026/01/28/smas/src/20-forward-ext-force-stable-neo-hookean-smas-only.py:57:15
   |
55 |   ) -> pv.UnstructuredGrid:
56 |       if "Force" not in mesh.point_data:
57 |           raise KeyError(
   |  _______________^
58 | |             "mesh is missing point_data['Force']; run 11-smas-bottom-force.py first"
59 | |         )
   | |_________^
60 |       mesh.point_data["Force"] = force_scale * np.asarray(mesh.point_data["Force"])
61 |       return mesh
   |

EM101 Exception must not use a string literal, assign to variable first
  --> exp/2026/01/28/smas/src/20-forward-ext-force-stable-neo-hookean-smas-only.py:58:13
   |
56 |     if "Force" not in mesh.point_data:
57 |         raise KeyError(
58 |             "mesh is missing point_data['Force']; run 11-smas-bottom-force.py first"
   |             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
59 |         )
60 |     mesh.point_data["Force"] = force_scale * np.asarray(mesh.point_data["Force"])
   |
help: Assign to variable; remove string literal

RUF046 Value being cast to `int` is already an integer
  --> exp/2026/01/28/smas/src/20-forward-ext-force-stable-neo-hookean.py:49:20
   |
47 | def format_lambda_value(lambda_value: float) -> str:
48 |     if np.isclose(lambda_value, round(lambda_value)):
49 |         return str(int(round(lambda_value)))
   |                    ^^^^^^^^^^^^^^^^^^^^^^^^
50 |     mantissa, exponent = f"{lambda_value:.0e}".split("e")
51 |     return f"{mantissa}e{int(exponent)}"
   |
help: Remove unnecessary `int` call

RUF046 Value being cast to `int` is already an integer
  --> exp/2026/01/28/smas/src/20-forward-ext-force.py:49:20
   |
47 | def format_lambda_value(lambda_value: float) -> str:
48 |     if np.isclose(lambda_value, round(lambda_value)):
49 |         return str(int(round(lambda_value)))
   |                    ^^^^^^^^^^^^^^^^^^^^^^^^
50 |     mantissa, exponent = f"{lambda_value:.0e}".split("e")
51 |     return f"{mantissa}e{int(exponent)}"
   |
help: Remove unnecessary `int` call

ARG001 Unused function argument: `failure_dir`
   --> exp/2026/01/28/smas/src/30-inverse-unreachable-stable-neo-hookean.py:286:5
    |
284 |     target: pv.UnstructuredGrid,
285 |     forward: Forward,
286 |     failure_dir: Path,
    |     ^^^^^^^^^^^
287 | ) -> MyInverse:
288 |     surface_indices: Integer[Array, " surface_points"] = mesh.surface_indices()
    |

D205 1 blank line required between summary line and description
  --> exp/2026/04/18/2d-demo/src/10-simulation.py:1:1
   |
 1 | / """2D Muscle-Fascia Neohookean FEM Simulation
 2 | | ==========================================
 3 | |
 4 | | Simulates a flat meat slab (100x11 elements) with a stiff fascia middle layer.
 5 | | Uses analytical First Piola-Kirchhoff stress with NumPy vectorized computation.
 6 | | Real-time visualization with Pygame.
 7 | |
 8 | | Material: Neohookean hyperelastic
 9 | |   Psi(F) = mu/2 * (tr(F^T F) - 2) - mu * ln(J) + lam/2 * (ln J)^2
10 | |   P      = mu * (F - F^{-T}) + lam * ln(J) * F^{-T}
11 | |
12 | | Controls:
13 | |     Up/Down    Increase/decrease wind force
14 | |     R          Reset simulation
15 | |     SPACE      Pause/resume
16 | |     W          Toggle wireframe overlay
17 | |     ESC        Quit
18 | | """
   | |___^
19 |
20 |   import sys
   |
help: Insert single blank line

D415 First line should end with a period, question mark, or exclamation point
  --> exp/2026/04/18/2d-demo/src/10-simulation.py:1:1
   |
 1 | / """2D Muscle-Fascia Neohookean FEM Simulation
 2 | | ==========================================
 3 | |
 4 | | Simulates a flat meat slab (100x11 elements) with a stiff fascia middle layer.
 5 | | Uses analytical First Piola-Kirchhoff stress with NumPy vectorized computation.
 6 | | Real-time visualization with Pygame.
 7 | |
 8 | | Material: Neohookean hyperelastic
 9 | |   Psi(F) = mu/2 * (tr(F^T F) - 2) - mu * ln(J) + lam/2 * (ln J)^2
10 | |   P      = mu * (F - F^{-T}) + lam * ln(J) * F^{-T}
11 | |
12 | | Controls:
13 | |     Up/Down    Increase/decrease wind force
14 | |     R          Reset simulation
15 | |     SPACE      Pause/resume
16 | |     W          Toggle wireframe overlay
17 | |     ESC        Quit
18 | | """
   | |___^
19 |
20 |   import sys
   |
help: Add closing punctuation

ANN001 Missing type annotation for function argument `f2v`
   --> exp/2026/04/18/2d-demo/src/10-simulation.py:126:16
    |
126 | def init_state(f2v):
    |                ^^^
127 |     """Initialize node positions and precompute reference configuration.
    |

ANN001 Missing type annotation for function argument `pos`
   --> exp/2026/04/18/2d-demo/src/10-simulation.py:185:28
    |
185 | def compute_elastic_forces(pos, f2v, Dm_inv, Dm_inv_T, W, elem_mu, elem_lam):
    |                            ^^^
186 |     """Compute internal elastic forces using the analytical Neohookean stress.
    |

ANN001 Missing type annotation for function argument `f2v`
   --> exp/2026/04/18/2d-demo/src/10-simulation.py:185:33
    |
185 | def compute_elastic_forces(pos, f2v, Dm_inv, Dm_inv_T, W, elem_mu, elem_lam):
    |                                 ^^^
186 |     """Compute internal elastic forces using the analytical Neohookean stress.
    |

ANN001 Missing type annotation for function argument `Dm_inv`
   --> exp/2026/04/18/2d-demo/src/10-simulation.py:185:38
    |
185 | def compute_elastic_forces(pos, f2v, Dm_inv, Dm_inv_T, W, elem_mu, elem_lam):
    |                                      ^^^^^^
186 |     """Compute internal elastic forces using the analytical Neohookean stress.
    |

ANN001 Missing type annotation for function argument `Dm_inv_T`
   --> exp/2026/04/18/2d-demo/src/10-simulation.py:185:46
    |
185 | def compute_elastic_forces(pos, f2v, Dm_inv, Dm_inv_T, W, elem_mu, elem_lam):
    |                                              ^^^^^^^^
186 |     """Compute internal elastic forces using the analytical Neohookean stress.
    |

ANN001 Missing type annotation for function argument `W`
   --> exp/2026/04/18/2d-demo/src/10-simulation.py:185:56
    |
185 | def compute_elastic_forces(pos, f2v, Dm_inv, Dm_inv_T, W, elem_mu, elem_lam):
    |                                                        ^
186 |     """Compute internal elastic forces using the analytical Neohookean stress.
    |

ANN001 Missing type annotation for function argument `elem_mu`
   --> exp/2026/04/18/2d-demo/src/10-simulation.py:185:59
    |
185 | def compute_elastic_forces(pos, f2v, Dm_inv, Dm_inv_T, W, elem_mu, elem_lam):
    |                                                           ^^^^^^^
186 |     """Compute internal elastic forces using the analytical Neohookean stress.
    |

ANN001 Missing type annotation for function argument `elem_lam`
   --> exp/2026/04/18/2d-demo/src/10-simulation.py:185:68
    |
185 | def compute_elastic_forces(pos, f2v, Dm_inv, Dm_inv_T, W, elem_mu, elem_lam):
    |                                                                    ^^^^^^^^
186 |     """Compute internal elastic forces using the analytical Neohookean stress.
    |

ANN001 Missing type annotation for function argument `pos`
   --> exp/2026/04/18/2d-demo/src/10-simulation.py:256:5
    |
255 | def substep(
256 |     pos,
    |     ^^^
257 |     vel,
258 |     rest_pos,
    |

ANN001 Missing type annotation for function argument `vel`
   --> exp/2026/04/18/2d-demo/src/10-simulation.py:257:5
    |
255 | def substep(
256 |     pos,
257 |     vel,
    |     ^^^
258 |     rest_pos,
259 |     f2v,
    |

ANN001 Missing type annotation for function argument `rest_pos`
   --> exp/2026/04/18/2d-demo/src/10-simulation.py:258:5
    |
256 |     pos,
257 |     vel,
258 |     rest_pos,
    |     ^^^^^^^^
259 |     f2v,
260 |     Dm_inv,
    |

ANN001 Missing type annotation for function argument `f2v`
   --> exp/2026/04/18/2d-demo/src/10-simulation.py:259:5
    |
257 |     vel,
258 |     rest_pos,
259 |     f2v,
    |     ^^^
260 |     Dm_inv,
261 |     Dm_inv_T,
    |

ANN001 Missing type annotation for function argument `Dm_inv`
   --> exp/2026/04/18/2d-demo/src/10-simulation.py:260:5
    |
258 |     rest_pos,
259 |     f2v,
260 |     Dm_inv,
    |     ^^^^^^
261 |     Dm_inv_T,
262 |     W,
    |

ANN001 Missing type annotation for function argument `Dm_inv_T`
   --> exp/2026/04/18/2d-demo/src/10-simulation.py:261:5
    |
259 |     f2v,
260 |     Dm_inv,
261 |     Dm_inv_T,
    |     ^^^^^^^^
262 |     W,
263 |     elem_mu,
    |

ANN001 Missing type annotation for function argument `W`
   --> exp/2026/04/18/2d-demo/src/10-simulation.py:262:5
    |
260 |     Dm_inv,
261 |     Dm_inv_T,
262 |     W,
    |     ^
263 |     elem_mu,
264 |     elem_lam,
    |

ANN001 Missing type annotation for function argument `elem_mu`
   --> exp/2026/04/18/2d-demo/src/10-simulation.py:263:5
    |
261 |     Dm_inv_T,
262 |     W,
263 |     elem_mu,
    |     ^^^^^^^
264 |     elem_lam,
265 |     fixed_mask,
    |

ANN001 Missing type annotation for function argument `elem_lam`
   --> exp/2026/04/18/2d-demo/src/10-simulation.py:264:5
    |
262 |     W,
263 |     elem_mu,
264 |     elem_lam,
    |     ^^^^^^^^
265 |     fixed_mask,
266 |     bottom_mask,
    |

ANN001 Missing type annotation for function argument `fixed_mask`
   --> exp/2026/04/18/2d-demo/src/10-simulation.py:265:5
    |
263 |     elem_mu,
264 |     elem_lam,
265 |     fixed_mask,
    |     ^^^^^^^^^^
266 |     bottom_mask,
267 |     wind,
    |

ANN001 Missing type annotation for function argument `bottom_mask`
   --> exp/2026/04/18/2d-demo/src/10-simulation.py:266:5
    |
264 |     elem_lam,
265 |     fixed_mask,
266 |     bottom_mask,
    |     ^^^^^^^^^^^
267 |     wind,
268 |     mass,
    |

ANN001 Missing type annotation for function argument `wind`
   --> exp/2026/04/18/2d-demo/src/10-simulation.py:267:5
    |
265 |     fixed_mask,
266 |     bottom_mask,
267 |     wind,
    |     ^^^^
268 |     mass,
269 | ):
    |

ANN001 Missing type annotation for function argument `mass`
   --> exp/2026/04/18/2d-demo/src/10-simulation.py:268:5
    |
266 |     bottom_mask,
267 |     wind,
268 |     mass,
    |     ^^^^
269 | ):
270 |     """Single substep of Symplectic Euler integration.
    |

ANN001 Missing type annotation for function argument `sim_pos`
   --> exp/2026/04/18/2d-demo/src/10-simulation.py:307:19
    |
307 | def sim_to_screen(sim_pos):
    |                   ^^^^^^^
308 |     """Convert simulation coordinates to screen pixel coordinates (y-flipped)."""
309 |     screen = np.empty_like(sim_pos)
    |

C901 `main` is too complex (18 > 10)
   --> exp/2026/04/18/2d-demo/src/10-simulation.py:320:5
    |
320 | def main():
    |     ^^^^
321 |     # --- Build mesh & initialize state ---
322 |     f2v, is_fascia, elem_mu, elem_lam = build_mesh()
    |

PLR0912 Too many branches (17 > 12)
   --> exp/2026/04/18/2d-demo/src/10-simulation.py:320:5
    |
320 | def main():
    |     ^^^^
321 |     # --- Build mesh & initialize state ---
322 |     f2v, is_fascia, elem_mu, elem_lam = build_mesh()
    |

PLR0915 Too many statements (57 > 50)
   --> exp/2026/04/18/2d-demo/src/10-simulation.py:320:5
    |
320 | def main():
    |     ^^^^
321 |     # --- Build mesh & initialize state ---
322 |     f2v, is_fascia, elem_mu, elem_lam = build_mesh()
    |

FBT003 Boolean positional value in function call
   --> exp/2026/04/18/2d-demo/src/10-simulation.py:431:37
    |
429 |         y_pos = 12
430 |         for fnt, text, color in hud_lines:
431 |             surf = fnt.render(text, True, color)
    |                                     ^^^^
432 |             screen.blit(surf, (15, y_pos))
433 |             y_pos += 28
    |

B007 Loop control variable `step` not used within loop body
   --> exp/2026/04/18/2d-demo/src/30-simulation-stable-neo-hookean-self-collision.py:829:9
    |
827 |     contact_points = np.empty((0, 2), dtype=pos.dtype)
828 |
829 |     for step in range(SUBSTEPS):
    |         ^^^^
830 |         substep_contacts, substep_points = substep(
831 |             pos,
    |
help: Rename unused `step` to `_step`

Found 47 errors.
No fixes available (13 hidden fixes can be enabled with the `--unsafe-fixes` option).

(Truncated to last 13333 characters out of 18919)

Notices

📣 MegaLinter 9.5.0 is out! Discover the new features and security recommendations in the release announcement. (Skip this info by defining SECURITY_SUGGESTIONS: false)

See detailed reports in MegaLinter artifacts

MegaLinter is graciously provided by OX Security
Show us your support by starring ⭐ the repository

liblaf-approve[bot]
liblaf-approve Bot previously approved these changes Jun 7, 2026
@liblaf
liblaf dismissed liblaf-approve[bot]’s stale review August 6, 2026 01:04

The merge-base changed after approval.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

automerge Merge the pull request once unit tests and other checks pass. copier

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant